flutter项目中,切换底部导航,如何保持页面的状态

151 阅读2分钟

刚开始的时候,我看到网上说使用AutomaticKeepAliveClientMixin,而且有些flutter的教学视频也是推荐这个,于是找了很多AutomaticKeepAliveClientMixin的使用案例,但是按照网上说的方式,始终没有效果,后面才在网上找到另外一个思路,就是使用IndexedStack来实现。

如下介绍:

在Flutter中,IndexedStack是一个特殊的堆栈组件,它允许你在多个子Widget之间进行切换。与普通的堆栈不同的是,IndexedStack只显示堆栈中的一个子Widget,并且它不会叠加子Widget。这对于实现标签切换效果(如Tab视图)非常有用。

下面是一个简单的使用IndexedStack的例子。在这个例子中,我们将创建一个具有两个页面的简单应用,并通过按钮来切换这两个页面。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'IndexedStack Demo',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _currentIndex = 0;

  final List<Widget> _pages = [
    Center(
      child: Text('Page One', style: TextStyle(fontSize: 32.0)),
    ),
    Center(
      child: Text('Page Two', style: TextStyle(fontSize: 32.0)),
    ),
  ];

  void _onItemTapped(int index) {
    setState(() {
      _currentIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('IndexedStack Demo'),
      ),
      body: IndexedStack(    // !!!关键就是这个地方!!!!!
        index: _currentIndex,
        children: _pages,
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.home),
            label: 'Home',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.school),
            label: 'School',
          ),
        ],
        currentIndex: _currentIndex,
        onTap: _onItemTapped,
      ),
    );
  }
}

这个例子创建了一个具有两个页面的应用,并且使用了BottomNavigationBar作为导航栏。当用户点击导航栏上的项目时,_onItemTapped方法会被调用,这将改变_currentIndex变量的值。IndexedStack会根据这个索引显示相应的页面。请注意,_pages列表包含了所有要切换的页面。

你可以根据需要修改这个例子,增加更多的页面或者改变页面的内容。希望这个例子对你有所帮助!