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"),
                )
              ],
            ),
          ),
相关推荐
2501_920931706 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
向哆哆7 小时前
打造高校四六级报名管理系统:基于 Flutter × OpenHarmony 的跨端开发实践
flutter·开源·鸿蒙·openharmony·开源鸿蒙
2501_940007897 小时前
Flutter for OpenHarmony三国杀攻略App实战 - 设置功能实现
flutter
东东5168 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino8 小时前
图片、文件的预览
前端·javascript
lbb 小魔仙8 小时前
【Harmonyos】开源鸿蒙跨平台训练营DAY9:获取分类数据并渲染
flutter·华为·harmonyos
mocoding9 小时前
Flutter 3D 翻转动画flip_card三方库在鸿蒙版天气预报卡片中的实战教程
flutter·3d·harmonyos
2501_920931709 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
AI老李10 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
方也_arkling10 小时前
Element Plus主题色定制
javascript·sass