zoukankan      html  css  js  c++  java
  • Flutter 保持页面状态

    用以前写的TabBar页面修改下,继续做保持页面状态的功能。

    混入:

    class _HomePageState extends State<HomePage> with AutomaticKeepAliveClientMixin{ //保持页面状态

    混入后

    1.重写wantKeepAlive

    @override
    bool get wantKeepAlive => true; //保持页面状态 重写方法

    2.必须是StatefulWidget

    3.启用pageView和IndexedStack

    在底部导航页面index_page.dart,修改:

    body: IndexedStack( 
              index:currentIndex,
              children: tabBodies,
       ),

     完整示例代码如下:

    import 'package:flutter/material.dart';
    import './keep_alive_demo.dart';
    
    class TabsPage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: KeepAliveDemo(),
          theme: ThemeData(
            primaryColor: Colors.red
          ),
        );
      }
    
    }
    
    class KeepAliveDemo extends StatefulWidget {
      _KeepAliveDemoState createState() => _KeepAliveDemoState();
    }
    
    class _KeepAliveDemoState extends State<KeepAliveDemo> with SingleTickerProviderStateMixin {
      TabController _controller;
      //初始状态方法
      @override
      void initState() {
        super.initState();
        _controller = TabController(
          length: 3,  //需要控制的Tab页数量
          vsync: this  //动画效果的异步处理,默认格式,背下来即可
        );
      }
      //销毁方法,当整个页面dispose时,记得把控制器也dispose掉,释放内存
      @override
      void dispose() {
        _controller.dispose();
        super.dispose();
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
             title: Text('Keep Alive Demo'),
             bottom: TabBar(
               controller: _controller, //配置控制器
               tabs: <Widget>[
                 Tab(icon: Icon(Icons.directions_car)),
                 Tab(icon: Icon(Icons.directions_transit)),
                 Tab(icon: Icon(Icons.directions_bike)),
               ],
               indicatorColor: Colors.white, //tab标签的下划线颜色
             ),
          ),
          body: TabBarView(
            controller: _controller, //配置控制器
            children: <Widget>[
              AliveDemo(),
              AliveDemo(),
              AliveDemo(),
            ],
          ),
        );
      }
    }

    新建keep_alive_demo.dart页面,代码如下:

    import 'package:flutter/material.dart';
    
    class MyHomePage extends StatefulWidget {
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    //混入AutomaticKeepAliveClientMixin,这是保持状态的关键
    //然后重写wantKeppAlive 的值为true。
    class _MyHomePageState extends State<MyHomePage> with AutomaticKeepAliveClientMixin {
      int _counter = 0;
      //重写keepAlive 为ture ,就是可以有记忆功能了。
      @override
      bool get wantKeepAlive => true;
      //声明一个内部方法,用来点击按钮后增加数量
      void _incrementCounter(){
        setState((){ _counter++;});
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body:Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text('点一下加1,点一下加1:'),
                Text(
                  '$_counter',
                  style:Theme.of(context).textTheme.display1,
                )
              ],
            ),
          ),
          //增加一个悬浮按钮,点击时触犯_incrementCounter方法
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    }

    注意三个地方

    1) class _MyHomePageState extends State<MyHomePage>
        with AutomaticKeepAliveClientMixin {
    2)  @override
      bool get wantKeepAlive => true;
    3)  @override
      Widget build(BuildContext context) {
        // 保持页面缓存,这句话必须加上
        super.build(context);

  • 相关阅读:
    如何随机生成指定数目的国标汉字?
    动态裁剪窗体标题栏
    N皇后问题
    谈谈五皇后问题
    一道趣味数学题
    In version 2.0, DB Query Analyzer will never be mistaken as virus by antivirus software
    从2.0版本开始,“万能数据库查询分析器”的中英文版本不再被误报成病毒
    Android_获取屏幕大小的两种方法
    广东电信公话201亲情月卡用户重复购买率模型的研究
    基于关系数据库的数据仓库星形模式下维使用原则的研究与探索
  • 原文地址:https://www.cnblogs.com/joe235/p/11286489.html
Copyright © 2011-2022 走看看