Flutter GetX状态管理中RxBool类型loading状态不更新问题求助
问题成因
- 响应式变量更新方式错误:你对
loading变量直接重新赋值true.obs/false.obs,相当于替换了原有的RxBool实例,页面监听的仍是初始化时的旧实例,无法收到后续的状态变更通知。 - 界面未添加响应式监听容器:GetX的响应式变量变更需要配合
Obx/GetX这类监听组件才能触发界面重建,你直接在build方法中读取loading属性,状态变更不会触发界面刷新。
解决办法
- 修改控制器中loading变量的赋值逻辑,仅修改
.value属性而非替换整个RxBool实例:
RxBool loading = false.obs; List<String> texts = <String>[].obs; getData() async { print('loading :' + loading.value.toString()); // 仅修改value属性 loading.value = true; print('loading :' + loading.value.toString()); var result = await http.get(Uri.parse(main_url)); print(result.statusCode.toString()); var data = json.decode(result.body); data.forEach((element) => texts.add(element["title"])); print(data); // 仅修改value属性 loading.value = false; print('loading :' + loading.value.toString()); }
- 界面中用
Obx包裹需要响应状态变化的组件,触发自动刷新:
class _HomePageState extends State<HomePage> { PostController controller = Get.put(PostController()); @override void initState() { super.initState(); controller.getData(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('App'),), // 用Obx包裹响应式区域 body: Obx(() => controller.loading.isTrue ? Center(child: CircularProgressIndicator()) : ListView.builder( itemBuilder: (context,index){ return Card(child: ListTile(title: Text(controller.texts[index],style: TextStyle(color: Colors.black,fontSize: 24),))); }, itemCount: controller.texts.length, ) ), ); } }
内容的提问来源于stack exchange,提问作者x-DZ-Ax
相关产品推荐
相关产品推荐

