Home > other >  LateInitializationError: Field has not been initialized in Flutter
LateInitializationError: Field has not been initialized in Flutter

Time:09-24

I'm considerably new to Flutter and I'm to build a Messenger Chap App on Flutter, and I face the issue of "LateInitilization: Field 'searchSnapShot' has not been initialized. Following is the snippet of code that is causing the issue:

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();
}

What this snippet is supposed to do is return a list of users that match the search query. Following is the code for the entire 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"),
          )
        ],
      ),
    );
  }
}

Error Description in 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.

What am I doing wrong here? I'd really appreciate some help. Thank you.

CodePudding user response:

When you use late it means that variable can be lazily initialised, So, before use it somewhere, you need to Initialise thus you cannot make null checks on that, If you want to make null checks on it then try ? which makes that variable a nullable.

So remove late and add ?

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

CodePudding user response:

Try this please

QuerySnapshot? <Map<String, dynamic>> searchSnapShot;
  • Related