Flutter运行报错LateInitializationError: chatRoomStream未初始化如何解决
问题原因
- 你使用
late关键字修饰chatRoomStream,相当于向Dart保证你会在使用这个变量前完成赋值,但实际运行时没有做到,触发LateInitializationError。 getUserInfo是异步方法,你在initState中调用它时没有等待执行完成,就直接调用databaseServices.getChatRooms(Constants.myName),此时Constants.myName可能还没完成赋值,会导致拉取聊天室列表的请求失败,进而无法给chatRoomStream赋值。- 即便拉取请求正常,异步操作返回结果需要时间,Flutter的build方法会在initState执行完成后立刻触发,此时
chatRoomStream还没完成赋值,就被chatRoomList方法调用,直接触发报错。
解决方法
- 首先将
chatRoomStream的声明从late非空类型改为可空类型,避免未初始化就被访问的报错:
// 修改前 late Stream chatRoomStream; // 修改后 Stream? chatRoomStream;
- 调整
chatRoomList方法,增加空判断和加载状态:
Widget chatRoomList() { // stream未初始化时显示加载动画 if(chatRoomStream == null) { return const Center(child: CircularProgressIndicator()); } return StreamBuilder( stream: chatRoomStream!, builder: (context, snapshot) { // 等待数据返回时显示加载动画 if(snapshot.connectionState == ConnectionState.waiting) { return const Center(child: CircularProgressIndicator()); } // 无数据时显示占位提示 if(!snapshot.hasData || (snapshot.data as QuerySnapshot).docs.isEmpty) { return const Center(child: Text("暂无会话记录")); } final querySnapshot = snapshot.data as QuerySnapshot; return ListView.builder( itemCount: querySnapshot.docs.length, itemBuilder: (context, index) { final doc = querySnapshot.docs[index]; return ChatRoomTile( doc["chatroomId"] .toString() .replaceAll("_", "") .replaceAll(Constants.myName, ""), doc["chatroomId"] ); }); }); }
- 调整初始化逻辑,等待用户信息获取完成后再拉取聊天室列表,同时增加mounted判断避免页面销毁后调用setState报错:
@override void initState() { super.initState(); initPageData(); } Future<void> initPageData() async { // 等待用户信息获取完成 await getUserInfo(); final stream = await databaseServices.getChatRooms(Constants.myName); // 页面还在挂载状态才更新状态 if(mounted) { setState(() { chatRoomStream = stream; }); } }
内容的提问来源于stack exchange,提问作者Agnelo Fernandes
相关产品推荐
相关产品推荐

