美文网首页
Flutter 页面状态保持

Flutter 页面状态保持

作者: 会飞的超大鱼 | 来源:发表于2023-04-19 21:42 被阅读0次

    使用 TabBar 和 TabBarView 结合展示数据,当页面 A 切换到 B,然后从 B 切换回 A,这时候就会发现 A 页面的状态又恢复到初始状态了,这不是想要的结果,需要减少不必要的重绘,这时候就需要页面状态保持。

    使用 AutomaticKeepAliveClientMixin 进行页面状态保持

    1. 新建一个有状态的 Widget 类
    2. 让 State 子类混入 AutomaticKeepAliveClientMixin
    3. 实现 wantKeepAlive 方法,返回值为 true
    4. build 方法中调用父类的 build 方法,示例:super.build(context)

    示例代码展示

    import 'package:flutter/material.dart';
    
    class KeepAliveWrapper extends StatefulWidget {
      final bool keepAlive;
      final Widget child;
    
      const KeepAliveWrapper({
        super.key,
        required this.child,
        this.keepAlive = true,
      });
    
      @override
      State<KeepAliveWrapper> createState() => _KeepAliveWrapperState();
    }
    
    class _KeepAliveWrapperState extends State<KeepAliveWrapper>
        with AutomaticKeepAliveClientMixin {
      @override
      Widget build(BuildContext context) {
        super.build(context);
        return widget.child;
      }
    
      @override
      bool get wantKeepAlive => widget.keepAlive;
    
      @override
      void didUpdateWidget(covariant KeepAliveWrapper oldWidget) {
        if (oldWidget.keepAlive != widget.keepAlive) {
          updateKeepAlive();
        }
    
        super.didUpdateWidget(oldWidget);
      }
    }
    

    以上代码就是一个可以直接使用的页面状态保持的 Widget 类,使用方便快捷。使用如下:

    TabBarView(
        controller: _tabController,
        children: [
            // DynamicListPage 就是需要状态保持的页面
            const KeepAliveWrapper(child: DynamicListPage()),
        ],
    )
    

    相关文章

      网友评论

          本文标题:Flutter 页面状态保持

          本文链接:https://www.haomeiwen.com/subject/runljdtx.html