Flutter 颤振-如何在从另一个类接收的数据上刷新ListView

Flutter 颤振-如何在从另一个类接收的数据上刷新ListView,flutter,listview,refresh,Flutter,Listview,Refresh,我从datareciver侦听器接收数据并将其添加到对象列表中,但无法从其他类上载listview。因此,当接收到数据时,listview有一个监听器可以更新 我把我所有的类和代码 ContentModel.dart-哪一个是我的模型 class ContentModel{ String dialogID; DialogModel(this.dialogID); } Global.dart--存储列表的全局类 class Globals { static List&

我从datareciver侦听器接收数据并将其添加到对象列表中,但无法从其他类上载listview。因此,当接收到数据时,listview有一个监听器可以更新

我把我所有的类和代码

ContentModel.dart-哪一个是我的模型

class ContentModel{
  
  String dialogID;

  DialogModel(this.dialogID);

}
Global.dart--存储列表的全局类

class Globals {
  
  static List<ContentModel> dialogList =new List<ContentModel>();
 
}
类全局变量{
静态列表对话框列表=新建列表();
}
main.dart--接收列表时显示列表的主视图

   List<ContentModel> _contentModel = Globals.dialogList;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
      child:ListView.builder(
                    padding: EdgeInsets.symmetric(horizontal: 12.0),
                    itemCount:_contentModel.length,
                    reverse: false,
                    controller: _scrollController,
                    itemBuilder: (BuildContext context, index) =>
                        buildChat(_contentModel[index]))
    ));
  }
List\u contentModel=Globals.dialogList;
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:容器(
子项:ListView.builder(
填充:边缘组。对称(水平:12.0),
itemCount:\u contentModel.length,
反面:错,
控制器:\ u滚动控制器,
itemBuilder:(构建上下文,索引)=>
buildChat(_contentModel[index]))
));
}
dart——数据接收器可以接收任何时间并将其保存在全局列表中

  class QuickBloxListenerManager{

       onMassageRecive(Function fun) async
      {
          try {
        await QB.chat.subscribeChatEvent(QBChatEvents.RECEIVED_NEW_MESSAGE,
            (data) {
              print( "New Message Arrive...");
          Map<String, Object> map = new Map<String, dynamic>.from(data);
          Map<String, Object> payload =
              new Map<String, dynamic>.from(map["payload"]);
 
  ContentModel newMsg = new ContentModel();
      
      newMsg.dialogID=payload['id'];

            Globals.messageList.messages.add(newMsg);

        }, onErrorMethod: (error) {
         
        });
      } on PlatformException catch (e) {
      
      }
    
      }
      
    }
类QuickBloxListenerManager{
onMassageRecive(函数fun)异步
{
试一试{
等待QB.chat.subscribeChatEvent(QBChatEvents.RECEIVED_NEW_消息,
(数据){
打印(“新邮件到达…”);
地图地图=新地图。从(数据);
地图有效载荷=
新地图。从(地图[“有效载荷]);
ContentModel newMsg=新ContentModel();
newMsg.dialogID=payload['id'];
Globals.messageList.messages.add(newMsg);
},onErrorMethod:(错误){
});
}平台上异常捕获(e){
}
}
}
您可以查看,这是颤振应用程序中非常常见的小部件,用于根据数据更改更新UI。 在这种情况下,您可以像这样实现应用程序的流程:

  • 创建StreamController
  • 导入'dart:async';
    类QuickBloxListenerManager{
    最终_controller=StreamController();
    Stream contentModelStream=>\u controller.Stream;
    //…其他线路
    }
    
  • 在数据接收器中,接收新数据后,将该数据添加到流中
  • onMassageRecive()异步{
    试一试{
    //…其他线路
    newMsg.dialogID=payload['id'];
    //在这里,我看到您引用了dialogList,所以我将在代码中使用该列表
    Globals.dialogList.add(newMsg);
    _controller.add(Globals.dialogList);
    //…其他线路
    }
    
  • 在UI中,使用StreamBuilder侦听数据:
  • class SomeScreen扩展StatefulWidget{
    //…其他线路
    //启动QuickBloxListenerManager类
    最终QuickBloxListenerManager _manager=QuickBloxListenerManager();
    //在initState()中获取数据
    @凌驾
    initState(){
    super.initState();
    _manager.onmassagericive();
    }
    @凌驾
    小部件构建(构建上下文){
    返回脚手架(
    主体:容器(
    孩子:StreamBuilder(
    流:_manager.contentModelStream,
    生成器:(上下文,快照){
    如果(!snapshot.hasData)返回容器();
    列表_contentModel=snapshot.data;
    返回ListView.builder(
    填充:边缘组。对称(水平:12.0),
    itemCount:\u contentModel.length,
    反面:错,
    控制器:\ u滚动控制器,
    itemBuilder:(构建上下文,索引)=>
    buildChat(_contentModel[index]))
    )
    );     
    } 
    );
    }
    }
    
    感谢您提供了清晰而有用的答案。