Getx PageView 保持页面状态


前言

在使用Get作为状态管理工具时,我的页面继承了GetView,在做首页时需要多个页面,但是继承了GetView的页面不能再继承AutomaticKeepAliveClientMixin,这就导致切换页面会会刷新.
我也不想将GetView改成StatefulWidget,本篇文章是我找到的解决方案
在这里插入图片描述


一、定义一个KeepAliveWrapper组件

class FhKeepAliveWrapper extends StatefulWidget {
  final Widget child;

  const FhKeepAliveWrapper({Key? key, required this.child}) : super(key: key);

  
  State<FhKeepAliveWrapper> createState() => _FhKeepAliveWrapperState();
}

class _FhKeepAliveWrapperState extends State<FhKeepAliveWrapper>
    with AutomaticKeepAliveClientMixin {
  
  Widget build(BuildContext context) {
    return widget.child;
  }

  
  // TODO: implement wantKeepAlive
  bool get wantKeepAlive => true;
}

这里就是一个很简单的StatefulWidget,它with 了AutomaticKeepAliveClientMixin,然后接收一个child 参数

二、使用步骤

PageView(
        controller: controller.pageController,
        children: const [
          FhKeepAliveWrapper(child: HomePage()),
          FhKeepAliveWrapper(child: StorePage()),
          FhKeepAliveWrapper(child: CustomerPage()),
          FhKeepAliveWrapper(child: MessagePage()),
          FhKeepAliveWrapper(child: MyPage()),
        ],
      ),

在使用的时候,直接将页面传入FhKeepAliveWrapper 组件即可


总结

最近已经很少写文章了,希望篇文章可以帮到需要的人,喜欢就收藏起来吧

### 使用 GetX 实现 Flutter TabBar 在 Flutter 应用程序中使用 GetX 来管理 `TabBar` 的状态和行为能够简化代码并提高可维护性。下面展示了一个完整的例子来说明如何通过 GetX 控制 `TabBar`。 #### 创建控制器类 首先定义一个继承自 `GetxController` 的控制器类,该类负责存储当前选中的标签页索引以及提供改变此索引的方法: ```dart import 'package:get/get.dart'; class TabsController extends GetxController { final PageController pageController = PageController(initialPage: 0); var tabIndex = 0.obs; void changeTabIndex(int index) { tabIndex.value = index; pageController.jumpToPage(index); // 同步页面跳转 } } ``` 这里利用了 `.obs` 将属性标记为响应式的,并且每当调用了 `changeTabIndex()` 方法更新索引时都会触发 UI 刷新[^3]。 #### 构建视图层 接着是在界面布局文件里构建实际的 `TabBar` 组件及其对应的子页面列表。注意要绑定之前创建好的控制器实例以便于数据共享: ```dart import 'package:flutter/material.dart'; import '../controllers/tabs_controller.dart'; class HomeView extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('GetX TabBar Example'), bottom: PreferredSize( preferredSize: Size.fromHeight(kToolbarHeight), child: Obx(() => TabBar( tabs: [ Tab(text: "Home"), Tab(text: "Profile"), Tab(text: "Settings") ], controller: Get.find<TabsController>().pageController, onTap: (index) => Get.find<TabsController>().changeTabIndex(index), )), ), ), body: PageView.builder( itemCount: 3, // 假设有三个选项卡 itemBuilder: (_, int index) { switch (index){ case 0: return Center(child: Text("Home Content")); case 1: return Center(child: Text("Profile Content")); default: return Center(child: Text("Settings Content")); } }, onPageChanged: (int index) => Get.find<TabsController>().changeTabIndex(index)[^4], physics: NeverScrollableScrollPhysics(), // 防止滑动切换 tab controller: Get.find<TabsController>().pageController, ) ); } } ``` 上述代码片段展示了如何设置顶部导航栏内的 `TabBar` 并关联至下方的内容区域 (`PageView`) 。当点击不同的标签项或是滚动到新的页面时会自动同步两个组件之间的状态变化[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半身风雪

感谢打赏,你的鼓励,是我创作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值