You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter如何使用Obx加载Record组件ListView替代Navigator.push并修复不显示问题

解决方案

1. 改造列表为响应式变量

Obx只会在监听的响应式变量变化时触发重绘,你当前使用的video_Body.records是普通静态List,值更新时无法通知Obx刷新,需要修改record_body.dart中的定义:

// 修改前
// static List<String>? records;
// 修改后 改成GetX响应式列表
static RxList<String> records = <String>[].obs;

对应的getter同步修改:

// 修改前
// List<String>? get record => video_Body.records;
// 修改后
List<String> get record => video_Body.records;

2. 给Obx添加records监听

你当前的Obx仅监听了controller.currentIndex.value,要让records变化时也触发刷新,需要在Obx回调中读取records的响应式值,同时给Record加高度约束,解决ListView无高度无法布局的问题:

body: Obx(() {
  // 加入这行让Obx监听到records的变化
  var recordList = video_Body.records;
  switch(RouteName.values[controller.currentIndex.value]) {
    case RouteName.Record:
      return SizedBox(
        // 可根据需求调整高度,外层是Column的话也可以用Expanded占满剩余空间
        height: MediaQuery.of(context).size.height * 0.8,
        child: Record(records: recordList.toList()),
      );
    // 其他case逻辑
  }
});

3. 处理StatefulWidget参数更新逻辑

Record是StatefulWidget,默认widget参数更新时不会触发State重绘,两种方案可选:

  • 方案一:直接将Record改为StatelessWidget(无内部状态的话更推荐)
  • 方案二:在_RecordState中添加参数更新回调:
@override
void didUpdateWidget(covariant Record oldWidget) {
  super.didUpdateWidget(oldWidget);
  if (oldWidget.records != widget.records) {
    setState(() {});
  }
}

4. 优化Record的非空判断

现在传入的列表不会为空,可修改build逻辑避免强制解包风险:

@override
Widget build(BuildContext context) {
  return (widget.records?.isEmpty ?? true) ? const SizedBox() : ListView.builder(
    itemCount: widget.records!.length,
    shrinkWrap: true,
    reverse: true,
    itemBuilder: (BuildContext context, int i) {
      return Card(
        elevation: 5,
        child: ExpansionTile(
          // 原有逻辑
        ),
      );
    },
  );
}

内容的提问来源于stack exchange,提问作者jiji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:54:00