zoukankan      html  css  js  c++  java
  • 16-Flutter移动电商实战-切换后页面状态的保持AutomaticKeepAliveClientMixin

    底栏切换每次都重新请求是一件非常恶心的事,flutter 中提供了AutomaticKeepAliveClientMixin 帮我们完成页面状态保存效果。

    1、AutomaticKeepAliveClientMixin

    AutomaticKeepAliveClientMixin 这个 Mixin 是 Flutter 为了保持页面设置的。哪个页面需要保持页面状态,就在这个页面进行混入。

    不过使用使用这个 Mixin 是有几个先决条件的:

    • 使用的页面必须是 StatefulWidget,如果是 StatelessWidget 是没办法办法使用的。
    • 其实只有两个前置组件才能保持页面状态:PageView 和 IndexedStack。
    • 重写 wantKeepAlive 方法,如果不重写也是实现不了的。

    2、修改index_page.dart

    明白基本知识之后,就可以修改 index_page.dart,思路就是增加一个 IndexedStack 包裹在 tabBodies 外边。

    整体代码如下:

    import 'package:flutter/cupertino.dart';
    import 'package:flutter/material.dart';
    import 'home_page.dart';
    import 'category_page.dart';
    import 'cart_page.dart';
    import 'member_page.dart';


    class IndexPage extends StatefulWidget {
      _IndexPageState createState() => _IndexPageState();
    }

    class _IndexPageState extends State<IndexPage>{

      PageController _pageController;

      final List<BottomNavigationBarItem> bottomTabs = [
        BottomNavigationBarItem(
          icon:Icon(CupertinoIcons.home),
          title:Text('首页')
        ),
        BottomNavigationBarItem(
          icon:Icon(CupertinoIcons.search),
          title:Text('分类')
        ),
        BottomNavigationBarItem(
          icon:Icon(CupertinoIcons.shopping_cart),
          title:Text('购物车')
        ),
         BottomNavigationBarItem(
          icon:Icon(CupertinoIcons.profile_circled),
          title:Text('会员中心')
        ),
      ];

      final List<Widget> tabBodies = [
        HomePage(),
        CategoryPage(),
        CartPage(),
        MemberPage()
      ];

      int currentIndex= 0;
      var currentPage ;

      @override
      void initState() {
       currentPage=tabBodies[currentIndex];
       _pageController=new PageController()
          ..addListener(() {
            if (currentPage != _pageController.page.round()) {
              setState(() {
                currentPage = _pageController.page.round();
              });
            }
      });
      super.initState();
      }

      @override
      Widget build(BuildContext context) {
        return Scaffold(
          backgroundColor: Color.fromRGBO(2442452451.0),
          bottomNavigationBar: BottomNavigationBar(
            type:BottomNavigationBarType.fixed,
            currentIndex: currentIndex,
            items:bottomTabs,
            onTap: (index){
              setState(() {
               currentIndex=index;
                currentPage =tabBodies[currentIndex]; 
              });

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

    3、加入Mixin保持页面状态

    在 home_page.dart 里加入 AutomaticKeepAliveClientMixin 混入,加入后需要重写 wantKeepAlive 方法。

    主要代码如下:

    class _HomePageState extends State<HomePagewith AutomaticKeepAliveClientMixin {

      @override
      bool get wantKeepAlive =>true;
    }

    为了检验结果,我们在 HomePageState 里增加一个 initState,在里边 print 一些内容,如果内容输出了,证明我们的页面重新加载了,如果没输出,证明我们的页面保持了状态。

    @override
    void initState() {
        super.initState();
        print('我打印了哈哈哈哈哈');
    }
  • 相关阅读:
    iptables详解(7):iptables扩展之udp扩展与icmp扩展
    iptables详解(6):iptables扩展匹配条件之’–tcp-flags’
    iptables(五)iptables匹配条件总结之二(常用扩展模块)
    Neutron之OVS
    Neutron三层网络服务实现原理
    Neutron二层网络服务实现原理
    LoadBalancerv2的原理分析
    Haproxy介绍
    基于zepto的手机焦点图touchstart touchmove
    zepto.js 处理Touch事件(实例)
  • 原文地址:https://www.cnblogs.com/niceyoo/p/11055259.html
Copyright © 2011-2022 走看看