LateInitializationError:Flutter 中字段尚未初始化

Ven*_*noM 14 android dart flutter

我对 Flutter 相当陌生,我要在 Flutter 上构建 Messenger Chap 应用程序,但我面临“LateInitilization:字段 'searchSnapShot' 尚未初始化”的问题。以下是导致该问题的代码片段:

Widget searchList() {
return searchSnapShot != null ? ListView.builder(
  itemCount: searchSnapShot.docs.length,
    shrinkWrap: true,
    itemBuilder: (context, index) {
      return SearchTile(
          userName: searchSnapShot.docs[index].data()["name"],
          userEmail: searchSnapShot.docs[index].data()["email"],
      );
    }
) : Container();
}
Run Code Online (Sandbox Code Playgroud)

此代码片段的作用是返回与搜索查询匹配的用户列表。以下是整个search.dart的代码:

    import 'package:chat_app/services/database.dart';
import 'package:chat_app/widgets/widgets.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class SearchScreen extends StatefulWidget {

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

class _SearchScreenState extends State<SearchScreen> {

  DatabaseMethods databaseMethods = new DatabaseMethods();
  TextEditingController searchTextEditingController = new TextEditingController();

  late QuerySnapshot <Map<String, dynamic>> searchSnapShot;

  initiateSearch() async {
    await databaseMethods
        .getUserByUsername(searchTextEditingController.text)
        .then((val) {
          setState(() {
              searchSnapShot = val;
          });
    });

  }

  Widget searchList() {
    return searchSnapShot != null ? ListView.builder(
      itemCount: searchSnapShot.docs.length,
        shrinkWrap: true,
        itemBuilder: (context, index) {
          return SearchTile(
              userName: searchSnapShot.docs[index].data()["name"],
              userEmail: searchSnapShot.docs[index].data()["email"],
          );
        }
    ) : Container();
  }

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: appBarMain(context),
      body: Container(
        child: Column(
          children: [
            Container(
              color: Color(0xffFFC200),
              padding: EdgeInsets.symmetric(horizontal: 24, vertical: 16),
              child: Row(
                children: [
                  Expanded(
                      child: TextField(
                        controller: searchTextEditingController,
                        decoration: InputDecoration(
                          hintText: "search username..",
                            hintStyle: TextStyle(
                              color: Colors.black,
                            ),
                          border: InputBorder.none,
                        ),
                      )
                  ),
                  GestureDetector(
                    onTap: () {
                       initiateSearch();
                      },
                    child: Container(
                        height: 30,
                        child: Image.asset("assets/images/search_white.png")),
                  ),
                ],
              ),
            ),
            searchList()
          ],
        ),
      ),
    );
  }
}

class SearchTile extends StatelessWidget {

  late final String userName;
  late final String userEmail;

  SearchTile({required this.userName, required this.userEmail});

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Row(
        children: [
          Column(
            children: [
              Text(
                userName,
                style: simpleTextStyle()
              ),
              Text(
                userEmail,
                style: simpleTextStyle(),
              ),
            ],
          ),
          Spacer(),
          Container(
            decoration: BoxDecoration(
              color: Colors.amber,
              borderRadius: BorderRadius.circular(40)
            ),
            padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
            child: Text("Message"),
          )
        ],
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Android Studio 错误描述:

    ======== Exception caught by widgets library =======================================================
The following LateError was thrown building SearchScreen(dirty, state: _SearchScreenState#f41e2):
LateInitializationError: Field 'searchSnapShot' has not been initialized.
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?我真的很感激一些帮助。谢谢。

Moh*_*hri 18

当你使用late它时意味着变量可以被延迟初始化,所以,在某个地方使用它之前,你需要初始化,因此你不能对其进行空检查,如果你想对其进行空检查,那么尝试使?该变量可以为空。

所以删除late并添加?

QuerySnapshot <Map<String, dynamic>>? searchSnapShot;
Run Code Online (Sandbox Code Playgroud)


Ana*_*ono 0

请尝试这个

QuerySnapshot? <Map<String, dynamic>> searchSnapShot;
Run Code Online (Sandbox Code Playgroud)