반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- uint16array
- swagger-typescript-api
- Redux
- RouteObserver
- identifierForVender
- Prism.js
- Game js
- userevent_tracker
- typescript
- jszip
- Babel standalone
- methodChannel
- web track
- uint8array
- Three-fiber
- Three js
- code editor
- KakaoMap
- webrtc
- REST API
- node
- react
- three.js
- Image Resize typescript
- Completer
- Flutter
- androidId
- babel
- Excel
- Raycasting
Archives
- Today
- Total
Never give up
Flutter - Indexed Stack with Provider 본문
반응형
BottomNavigationBar 등을 통해 화면전환을 할 때
Indexed Stack을 이용하여 화면전환을 하면 더 관리하기 편하고
바뀌는 인덱스에 따라 해당되는 페이지를 보여줍니다
Provider를 이용하여 StatelessWidget에서 구현해봤습니다
(이후 다른 예제에서 많이 사용할 예정이어서 MultiProvider를 사용했습니다)
메인
void main() {
runApp(MultiProvider(
providers: [ChangeNotifierProvider(create: (_) => PageViewModel())],
child: const MaterialApp(home: Main()),
));
}
메인화면
class Main extends StatelessWidget {
const Main({super.key});
final List<Widget> _screenData = const [Screen1(), Screen2()];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Indexed Stack')),
body: SafeArea(
child: Consumer<PageViewModel>(
builder: (_, vm, __) {
return IndexedStack(
index: vm.getPageNum,
children: _screenData,
);
},
),
),
bottomNavigationBar: Consumer<PageViewModel>(builder: (_, vm, __) {
return BottomNavigationBar(
showUnselectedLabels: false,
currentIndex: vm.getPageNum,
items: const [
BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Screen1'),
BottomNavigationBarItem(icon: Icon(Icons.event), label: 'Screen2'),
],
onTap: (value) => vm.setPage(value),
);
}),
);
}
}
화면 1, 2
class Screen1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(child: Text('Screen 1'));
}
}
class Screen2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Center(child: Text('Screen 2'));
}
}
페이지 데이터
class PageData extends ChangeNotifier {
int _pageNum = 0; //0 : screen1 1: screen2
int get getPageNum => _pageNum;
void setPage(int index) {
_pageNum = index;
notifyListeners();
}
}
Provider를 통해 stateless위젯에서도 사용 가능하고
위젯트리의 다른부분에서 필요한 데이터를 변경하기에도 유용하고
데이터와 화면(UI)의 관심사 분리를 통해 유지보수하기에도 유용해집니다
이외에도 BLoC, Scoped model, InheritedWidget, Redux, Mobx등 다양한 방법이 있습니다
반응형
'Flutter' 카테고리의 다른 글
Flutter - Listview with Listener (0) | 2020.08.03 |
---|---|
Flutter - Listview with ScrollController (2) | 2020.08.03 |
Flutter - AnimatedBuilder with transition (0) | 2020.08.03 |
Flutter - Splash Screen(Loading screen) (0) | 2020.08.03 |
Flutter - onBackPressed(WillPopScope) (0) | 2020.08.03 |
Comments