Flutter页面缓存

定义一个单独的KeepAliveWrapper.dart 的tool文件

import 'package:flutter/material.dart';

class KeepAliveWrapper extends StatefulWidget {
  const KeepAliveWrapper(
      {Key? key, @required this.child, this.keepAlive = true})
      : super(key: key);
  final Widget? child;
  final bool keepAlive;
  @override
  State<KeepAliveWrapper> createState() => _KeepAliveWrapperState();
}

/**
 *  AutomaticKeepAliveClientMixin 可以快速的实现页面缓存功能,
 * 但是通过混入的方式实现不是很优雅,所以我们有必要对
 * AutomaticKeepAliveClientMixin 混入进行封装
 */

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) {
// keepAlive 状态需要更新,实现在 AutomaticKeepAliveClientMixin 中
      updateKeepAlive();
    }
    super.didUpdateWidget(oldWidget);
  }
}

在使用时传入它要缓存的子元素,以及是否开启缓存两个参数,一般为了防止TabBar点击之后切换回来长列表的滚动条又回到最上方,给用户带来不好的体验。

        KeepAliveWrapper(
            /**
             * // 自定义缓存组件,防止点击TabBar之后页面跳回最上方
             */
            keepAlive: true,
            child: ListView(
              children: const [
                ListTile(
                  title: Text("关注列表1"),
                ),
                ListTile(
                  title: Text("关注列表2"),
                ),
                ListTile(
                  title: Text("关注列表3"),
                ),
                ListTile(
                  title: Text("关注列表4"),
                ),
                ListTile(
                  title: Text("关注列表5"),
                ),
                ListTile(
                  title: Text("关注列表6"),
                ),
                ListTile(
                  title: Text("关注列表7"),
                ),
                ListTile(
                  title: Text("关注列表8"),
                ),
                ListTile(
                  title: Text("关注列表9"),
                ),
                ListTile(
                  title: Text("关注列表10"),
                ),
                ListTile(
                  title: Text("关注列表11"),
                ),
                ListTile(
                  title: Text("关注列表12"),
                ),
                ListTile(
                  title: Text("关注列表13"),
                ),
                ListTile(
                  title: Text("关注列表14"),
                ),
                ListTile(
                  title: Text("关注列表15"),
                ),
                ListTile(
                  title: Text("关注列表16"),
                ),
                ListTile(
                  title: Text("关注列表17"),
                ),
                ListTile(
                  title: Text("关注列表18"),
                )
              ],
            ),
          ),
相关推荐
cs_dn_Jie2 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic2 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿3 小时前
webWorker基本用法
前端·javascript·vue.js
清灵xmf4 小时前
TypeScript 类型进阶指南
javascript·typescript·泛型·t·infer
小白学大数据4 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
qq_390161774 小时前
防抖函数--应用场景及示例
前端·javascript
334554324 小时前
element动态表头合并表格
开发语言·javascript·ecmascript
John.liu_Test4 小时前
js下载excel示例demo
前端·javascript·excel
PleaSure乐事5 小时前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro
哟哟耶耶5 小时前
js-将JavaScript对象或值转换为JSON字符串 JSON.stringify(this.SelectDataListCourse)
前端·javascript·json