使用IndexedStack来切换TabPage

2023-04-19  本文已影响0人  Jagtu

IndexedStack 是一个控件,可以用来在多个子控件之间进行切换,与 Stack 不同,IndexedStack 只会显示其中一个子控件,并根据提供的索引值决定要显示哪个子控件。

IndexedStack 的构造函数如下:

IndexedStack({
  Key? key,
  int index = 0,
  AlignmentGeometry alignment = Alignment.topLeft,
  TextDirection? textDirection,
  StackFit sizing = StackFit.loose,
  List<Widget> children = const <Widget>[],
}) 

其中,参数 index 表示要显示的子控件的索引值,默认值为 0,表示显示第一个子控件。

下面是一个简单的示例,展示了如何使用 IndexedStack:

IndexedStack(
  index: _selectedIndex,
  children: [
    Container(
      color: Colors.red,
      child: Center(
        child: Text('Page 1'),
      ),
    ),
    Container(
      color: Colors.blue,
      child: Center(
        child: Text('Page 2'),
      ),
    ),
    Container(
      color: Colors.green,
      child: Center(
        child: Text('Page 3'),
      ),
    ),
  ],
)

在上面的示例中,IndexedStack 包含了三个子控件,分别是三个不同颜色的 Container,并且当前要显示的子控件的索引值为 _selectedIndex。

因此,我们可以通过IndexedStack来设置TabPage页面的切换

class MainPage extends GetView<MainController> {
  MainPage({super.key});

  @override
  Widget build(BuildContext context) {
    SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.dark);
    return Obx(() => Scaffold(
      body: IndexedStack(
        alignment: Alignment.topCenter,
        sizing: StackFit.loose,
        index: controller.getCurrentIndex(controller.currentTab.value),
        children: [
          const HomeTabPage(),//首页
          const MessageTabPage(),//消息
          const MineTabPage(),    //个人中心
        ],
      ),
      resizeToAvoidBottomInset: false,
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: controller.getCurrentIndex(controller.currentTab.value),
        onTap: (index) => controller.switchTab(index),
        iconSize: 0.0,
        selectedFontSize: 10,
        unselectedFontSize: 10,
        elevation: 8,
        fixedColor: Theme.of(context).colorScheme.primary,
        //选中颜色
        enableFeedback: true,
        backgroundColor: Colors.white,
        type: BottomNavigationBarType.fixed,
        items: [
          BottomBarItem(
            title: '首页',
            imageName: 'assets/images/icon_tab_home.png',
            activeImageName: 'assets/images/icon_tab_home_selected.png',
            badge: controller.badges[0],
          ),
          BottomBarItem(
            title: '消息中心',
            imageName: 'assets/images/icon_tab_message.png',
            activeImageName: 'assets/images/icon_tab_message_selected.png',
            badge: controller.badges[1],
          ),
          BottomBarItem(
            title: '个人中心',
            imageName: 'assets/images/icon_tab_mine.png',
            activeImageName: 'assets/images/icon_tab_mine_selected.png',
            badge: controller.badges[2],
          ),
        ],
      ),
    ));
  }
}

可以使用Obx或GetBuilder等GetX提供的状态管理工具,监听子Widget的状态变化来进行操作。

上一篇下一篇

猜你喜欢

热点阅读