Flutter使用GetX管理状态时Widget不随状态更新刷新如何解决?
问题原因&修复方案
核心问题共有3处:
- 没有用
Obx包裹需要响应状态变化的Text组件,GetX只有被Obx包裹的组件才会监听响应式变量的变化自动刷新UI - 修改响应式变量的值时没有访问
.value属性,代码中直接把RxBool类型的item赋值成了bool类型的true,相当于直接覆盖了响应式变量本身,而不是修改它存储的状态值 Get.put逻辑放在了build方法中,build会随页面重建多次执行,属于不规范的初始化写法- 响应式变量类型定义不规范,不需要用
dynamic,直接声明为RxBool即可
修正后完整代码:
import 'package:flutter/material.dart'; import 'package:get/get.dart'; void main() { runApp(GetMaterialApp(home : Home())); } class BoolItem extends GetxController{ // 规范声明响应式变量类型 RxBool item = false.obs; // 修改时访问.value属性赋值 changeItem()=> item.value = true; } class Home extends StatefulWidget { const Home({ Key? key }) : super(key: key); @override _HomeState createState() => _HomeState(); } class _HomeState extends State<Home> { // 提前声明控制器 late final BoolItem b; @override void initState() { super.initState(); // 初始化放到initState中,避免build重复执行 b = Get.put(BoolItem()); } @override Widget build(context) { return Scaffold( appBar: AppBar(title: Text('welcome')), body: Center( child: Column(children: <Widget>[ FloatingActionButton( child: Icon(Icons.add), onPressed: (){ b.changeItem(); } ), // 用Obx包裹需要响应变化的组件 Obx(() => b.item.value ? Text('true') : Text('false')) ] )) ); } }
内容的提问来源于stack exchange,提问作者sojinLee
相关产品推荐
相关产品推荐

