即使收到更新的数据,Flutter ListView.builder 的 UI 也不会被 getx 更新

Posted

技术标签:

【中文标题】即使收到更新的数据,Flutter ListView.builder 的 UI 也不会被 getx 更新【英文标题】:Flutter ListView.builder's UI not getting updated by getx even if it receives updated data 【发布时间】:2021-12-27 05:53:58 【问题描述】:

我是初学者尝试用颤振学习 getx,这是我的控制器

class QuestionAnswers_Getx extends GetxController 
  final _questionandanswers = <QA>[].obs;
  List<QA> get questionandanswers => _questionandanswers;

  @override
  void onInit() 
    super.onInit();
    getall_questionandanswers();
    Future.delayed(Duration.zero,()=>listen_firebase());
  


  getall_questionandanswers() async 
    await qaref.get().then((QuerySnapshot query)
      _questionandanswers.addAll(query.docs.map((DocumentSnapshot doc) => doc_to_obj(doc)).toList());
    );
  

  listen_firebase() async 
    await qaref.snapshots().listen((QuerySnapshot querySnapshot) 
          
          querySnapshot.docChanges.forEach((DocumentChange doc)          
              if(doc.type==DocumentChangeType.added)
                  _questionandanswers.add(doc_to_obj(doc.doc));          
              else if(doc.type==DocumentChangeType.modified)
                _questionandanswers[doc.newIndex] = doc_to_obj(doc.doc);
                // print(_questionandanswers[doc.newIndex]);
              else if(doc.type==DocumentChangeType.removed)
                print("getx--------------removed line");
              
          );
     );

  


这是我的 Obx 小部件,我想在其中使用控制器的数据。我在前面的页面中使用了 get.put 并在此处找到控制器

final qa_controller = Get.find<QuestionAnswers_Getx>();
Obx(() 
              RxList<QA> myqa = <QA>[].obs;
              myqa.addAll( qa_controller.questionandanswers.where((element)=>element.user_name=="Jaswant patil").toList()   );                
//here if i use print(myqa[0].answer) then it gives me old as well as new data for answer parameter
                  return ListView.builder(
                      scrollDirection: Axis.vertical,   
                      shrinkWrap: true,
                      physics: ScrollPhysics(),
                      itemCount: myqa.length,
                      itemBuilder: (context,index)
                          return QAwidget(
                              answer: myqa[index].answer,
                              comment_count: myqa[index].comment_count,
                              upvotes: myqa[index].upvotes,
                              user_image_url:
                                  "https://cdn.pixabay.com/photo/2020/02/24/06/33/crescent-4875339__340.jpg",
                              user_name: myqa[index].user_name,
                              user_occupation: myqa[index].user_occupation,
                              post_image_url: myqa[index].post_image_url,
                              category: myqa[index].category,
                              hasimage: myqa[index].hasimage,
                              question: myqa[index].question);
                      ,

上面的 ListView 在 Ui 中正确显示了初始数据,但即使正在接收更新的数据,也不会在数据更改时显示更新的 UI。但是当我交换页面并再次返回此页面时,会显示更新的数据,我认为需要在数据更改时调用 setState 但不知道放在哪里。

感谢您的回答,请原谅上述问题中出现的任何语法错误

【问题讨论】:

QAwidget 有状态吗? No QAwidget 不是有状态的 【参考方案1】:

首先,尝试使用 variablename.value.addAll 那是行不通的 你可以随时刷新变量,我认为 observables 有一个方法调用 refresh()

【讨论】:

以上是关于即使收到更新的数据,Flutter ListView.builder 的 UI 也不会被 getx 更新的主要内容,如果未能解决你的问题,请参考以下文章

即使更新 Flutter,Dart 版本仍然相同

即使更新了各自的变量,也无法在 Flutter 中更新上下文

即使在更新 Flutter 之后医生说尝试重新安装或更新您的 Android SDK Manager

即使 Flutter 应用程序在后台,如何自动响应 Firebase Document Stream 更新? [关闭]

Flutter:如何在用户移动时获得精确的速度和行进距离?

Flutter HiveDB 从数据库中删除