簡體   English   中英

LateInitializationError:字段“chatRoomsStream”尚未在 Flutter 中初始化

[英]LateInitializationError: Field 'chatRoomsStream' has not been initialized in Flutter

我正在使用 Firebase 在 Flutter 上構建一個 Messenger 應用程序,當我點擊與另一個用戶聊天時 - 在加載之前的消息之前我得到了這個異常。

  ======== Exception caught by widgets library =======================================================
The following LateError was thrown building ChatRoom(dirty, state: _ChatRoomState#be2bb):
LateInitializationError: Field 'chatRoomsStream' has not been initialized.

The relevant error-causing widget was: 
  ChatRoom file:///D:/Android/chat_app/lib/main.dart:47:55
When the exception was thrown, this was the stack: 
#0      _ChatRoomState.chatRoomsStream (package:chat_app/views/chatRoomsScreen.dart)
#1      _ChatRoomState.chatRoomList (package:chat_app/views/chatRoomsScreen.dart:29:15)
#2      _ChatRoomState.build (package:chat_app/views/chatRoomsScreen.dart:83:15)
#3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4691:27)
#4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4574:15)
...
====================================================================================================

這是導致問題的chatRoomsScreen.dart頁面,這是每次用戶想要與另一個用戶聊天時加載的頁面:

    import 'package:chat_app/helper/authenticate.dart';
import 'package:chat_app/helper/constants.dart';
import 'package:chat_app/helper/helperfunctions.dart';
import 'package:chat_app/services/auth.dart';
import 'package:chat_app/services/database.dart';
import 'package:chat_app/views/conversationScreen.dart';
import 'package:chat_app/views/search.dart';
import 'package:chat_app/views/signin.dart';
import 'package:chat_app/widgets/widgets.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class ChatRoom extends StatefulWidget {
  const ChatRoom({Key? key}) : super(key: key);

  @override
  _ChatRoomState createState() => _ChatRoomState();
}

class _ChatRoomState extends State<ChatRoom> {

  AuthMethods authMethods = new AuthMethods();
  DatabaseMethods databaseMethods = new DatabaseMethods();

  late Stream<QuerySnapshot> chatRoomsStream;

  Widget chatRoomList() {
    return StreamBuilder(
      stream: chatRoomsStream,
      builder: (context, snapshot) {
        return snapshot.hasData ? ListView.builder(
          itemCount: (snapshot.data as QuerySnapshot).docs.length,
          itemBuilder: (context, index) {
            return ChatRoomsTile(
                (snapshot.data as QuerySnapshot).docs[index]["chatroomid"]
                    .toString().replaceAll("_", "")
                    .replaceAll(Constants.myName, ""),
                (snapshot.data as QuerySnapshot).docs[index]["chatroomid"]
            );
          },
        ) : Container();
      },
    );
  }

  @override
  void initState() {
    getUserInfo();
    super.initState();
  }

  getUserInfo() async {
    Constants.myName = (await HelperFunctions.getUserNameSharedPreference())!;
    databaseMethods.getChatRooms(Constants.myName).then((value) {
      setState(() {
        chatRoomsStream = value;
      });
    });
    setState(() {

    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
              title: Image.asset("assets/images/logo.png", height: 50.0),

        actions: [
          GestureDetector(
            onTap: () {
              authMethods.signOut();
              Navigator.pushReplacement(context,
              MaterialPageRoute(builder: (context) => Authenticate()
              ));
            },
            child: Container(
              padding: EdgeInsets.symmetric(horizontal: 16),
                child: Icon(Icons.exit_to_app)),
          ),
        ],),
        body: chatRoomList(),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            Navigator.pushReplacement(context, MaterialPageRoute(
              builder: (context) => SearchScreen()
            ));
          },
          child: Icon(Icons.search),
        ),
    );
  }
}

class ChatRoomsTile extends StatelessWidget {
  late final String userName;
  late final String chatRoomId;

  ChatRoomsTile(this.userName,this.chatRoomId);
  
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () {
        Navigator.push(context, MaterialPageRoute(
          builder: (context) => ConversationScreen(chatRoomId: chatRoomId)
        ));
      },
      child: Container(
        padding: EdgeInsets.symmetric(horizontal: 24, vertical: 20),
        child: Row(
          children: [
            Container(
              height: 40,
              width: 40,
              alignment: Alignment.center,
              decoration: BoxDecoration(
                  color: Colors.amber,
                  borderRadius: BorderRadius.circular(30)),

              child: Text(userName.substring(0, 1),
                  textAlign: TextAlign.center,
                  style: TextStyle(
                      color: Colors.white,
                      fontSize: 16,
                      fontFamily: 'OverpassRegular',
                      fontWeight: FontWeight.w300)),
            ),
              SizedBox(width: 12,),
              Text(userName, style: mediumTextStyle(),),
          ],
        ),
      ),
    );
  }
}

chatRoomsStream我做錯了什么? 我正在盡可能早地初始化它,對我來說,它已經完成了它應該做的。 也許你們中的一位可以指出為什么每次加載此頁面時我都會收到此異常 - 非常感謝幫助,謝謝。

而不是late Stream<QuerySnapshot> chatRoomsStream;

使用Stream<QuerySnapshot>? chatRoomsStream; Stream<QuerySnapshot>? chatRoomsStream;

當您調用chatRoomStream時,將其稱為chatRoomStream! 這是 null 安全了解 null 安全

對於您的友好信息,使用late關鍵字意味着當您第一次使用它時,瞬間將被初始化。 喜歡:

late int value = 5;
late int value; // you got the error 

欲了解更多安全信息 null

有關惰性初始化的更多信息

注意:在你的情況下,你可以刪除late ,否則初始化它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM