Flutter Tab 切换时保留tab的状态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flutter Tab 切换时保留tab的状态相关的知识,希望对你有一定的参考价值。

参考技术A

当我们在Flutter开发中,使用到Tabbar 切换页面时,我们会发现一个现象,
就是我从 tab1 => tab2 = > tab3 ,控制台打印的日志,会发现 分别走了 tab1页面 tab2页面 tab3 页面的 初始化状态函数 initState() ,这是正常的操作;
但是如果我再从 tab 3 => tab2 => tab1,这时我们发现, 同样的也走了 tab2,1的 initState() 函数,也就是说** initState()** 会被重复调用, 这时,我们就需要切换tab时记录tab 页面的状态,避免 initState() 函数被重复调用。

解决方法:其实很简单,我们只需要在tab 页面
添加 AutomaticKeepAliveClientMixin ,并实现对应的方法 bool get wantKeepAlive => true; ,就可啦!!

Flutter切换tab后保留tab状态

Flutter切换tab后保留tab状态

概述

Flutter中为了节约内存不会保存widget的状态,widget都是临时变量。当我们使用TabBar,TabBarView是我们就会发现,切换tab后再重新切换回上一页面,这时候tab会重新加载重新创建,体验很不友好。Flutter出于自己的设计考虑并没有延续android的ViewPager这样的缓存页面设计,毕竟控件两端都要开发,目前还在beta版本有很多设计还不够完善,但是设计的拓展性没得说,flutter还是为我们提供了解决办法。我们可以强制widget不显示情况下保留状态,下回再加载时就不用重新创建了。

AutomaticKeepAliveClientMixin

AutomaticKeepAliveClientMixin 是一个抽象状态,使用也很简单,我们只需要用我们自己的状态继承这个抽象状态,并实现 wantKeepAlive 方法即可。

继承这个状态后,widget在不显示之后也不会被销毁仍然保存在内存中,所以慎重使用这个方法。

详细官方文档请看这里
这里还有一个说的比较详细的 demo

class PageContentState extends<PageContent> 
    with AutomaticKeepAliveClientMixin 

    @override
    bool get wantKeepAlive => true;

DEMO

// main.dart
// 核心代码如下:

class PageContent extends StatefulWidget 
  @override
  State<StatefulWidget> createState() => new PageContentState();


class PageContentState extends State<PageContent>
    with AutomaticKeepAliveClientMixin


  @override
  bool get wantKeepAlive => true;

  ···


class V2EX extends StatelessWidget 
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) 
    return new MaterialApp(
        title: 'Flutter Demo',
        theme: new ThemeData(
            primaryColor: Colors.white),
        home: new DefaultTabController(
          length: choices.length,
          child: new Scaffold(
            appBar: new AppBar(
              title: new Center(
                child: new Container(
                  width: 300.0,
                  child: new TabBar(
                    indicatorColor: Colors.black54,
                    isScrollable: true,
                    tabs: choices.map((Choice choice) 
                      return new Container(
                        width: 125.0,
                        child: new Tab(
                          text: choice.title,
                        ),
                      );
                    ).toList(),
                  ),
                ),
              ),
            ),
            body: new TabBarView(
              key: new Key('Home Page'),
              children: choices.map((Choice choice) 
                return new Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: new ChoiceCard(choice: choice),
                );
              ).toList(),
            ),
          ),
        ));
  


const List<Choice> choices = const <Choice>[
  const Choice(title: '热门'),
  const Choice(title: '最新'),
];

class ChoiceCard extends StatelessWidget 
  const ChoiceCard(Key key, this.choice) : super(key: key);

  final Choice choice;

  @override
  Widget build(BuildContext context) 
    return new Card(
      color: Colors.white,
      child: PageContent(),
    );
  

以上是关于Flutter Tab 切换时保留tab的状态的主要内容,如果未能解决你的问题,请参考以下文章

tab切换(修改)

Flutter——TabBar组件(顶部Tab切换组件)

Flutter 三个页面由tab和TabBarView实现,其中一个页面是webview,切换tab,怎么取消Webview的页面

flutter多个输入表单可以点击tab进行切换

Flutter学习日记之自定义AppBar&顶部Tab切换

JavaScript实现Tab栏切换