Never give up

Flutter - Indexed Stack with Provider 본문

Flutter

Flutter - Indexed Stack with Provider

대기만성 개발자 2020. 8. 3. 16:13
반응형

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등 다양한 방법이 있습니다

반응형
Comments