Flutter GetX 状态管理在BottomSheet中Controller未销毁问题定位

本文分析了在使用Flutter GetX进行状态管理时,BottomSheet中的Controller未被销毁的问题。通过研究代码,发现GetModalBottomSheetRoute在dispose时没有正确清理Controller。而GetDialogRoute和GetPageRoute在dispose时进行了清理。为了解决这个问题,文章建议使用GetX代替Obx,并确保设置global为false。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在BottomSheet中使用Obx方式做状态管理,发现Controller未销毁掉。

return Obx(() {
      return PageStateManager(
        () {
          return getContent(context);
        },
        state.loadState.value,
        errorCode: state.errorCode.value,
        errorMsg: state.errorMsg.value,
        onRetryTap: state.onRetryTap,
      );
    });

分析代码发现Get.put的时候,主要是把Controller存在GetInstance的_singl Map中,如果controller没被移除,应该是delete方法没被调用。

查看get_navigation中src/bottomsheet/bottomsheet.dart代码,发现GetModalBottomSheetRoute在dispose中并没有做任何操作。

而src/dialog/dialog_route.dart代码中,GetDialogRoute重写了dispose,调用了GetInstance().removeDependencyByRoute进而调用了delete。

src/routes/default_route.dart中,GetPageRoute同样重写了dispose,并调用了GetIn

### Flutter GetxController 方法文档及使用示例 Getx 是一款轻量级的状态管理工具,适用于 Flutter 应用程序开发。`GetX` 提供了一种简单而高效的方式来管理和监听状态变化。 #### 创建控制器类 为了创建一个 `GetxController` 类,开发者需继承自 `GetxController` 并实现所需逻辑: ```dart import 'package:get/get.dart'; class MyController extends GetxController { var count = 0.obs; void increment() => count++; } ``` 此代码片段展示了如何定义一个简单的计数器控制器[^1]。 #### 初始化控制器实例 可以通过多种方式初始化控制器,在页面加载时自动绑定到生命周期的方法之一是通过 `Get.put()` 或者利用依赖注入的方式: ```dart final controller = Get.put(MyController()); // or using dependency injection pattern ``` 这种方式确保了当页面销毁时会清理资源并释放内存。 #### 访问控制器中的变量和函数 一旦有了控制器对象之后就可以很方便地访问其属性以及调用其中的方法: ```dart Text('Count: ${controller.count.value}'), ElevatedButton( onPressed: () { controller.increment(); }, child: Text('Increment') ), ``` 上述例子中展示了一个按钮点击事件触发增加数值的操作,并实时更新 UI 显示最新数据。 #### 处理异步操作 对于涉及网络请求或其他耗时任务的情况,可以借助于 `Future<void>` 和 `async/await` 关键字来处理复杂的业务流程而不阻塞主线程执行其他工作: ```dart void fetchData() async { try { final data = await ApiClient().fetchData(); update([data]); } catch (_) {} } ``` 这里假设有一个名为 `ApiClient` 的服务层负责与服务器交互获取远程数据源的信息。 #### 刷新视图 每当修改观察者类型的成员变量(即带有 `.obs` 后缀的对象),都会通知所有订阅该字段的小部件重新绘制自己从而达到刷新界面的效果;也可以显式地调用 `update()` 来强制刷新整个组件树或指定部分区域内的子节点列表。 ```dart RxInt counter = 0.obs; ... counter.value += 1; // 自动刷新UI ... update(['specificKey']); // 手动刷新特定key对应的widget subtree ``` 以上就是关于 `GetxController` 基本概念及其常见应用场景介绍,希望可以帮助理解这个强大的状态管理模式下的具体实践细节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值