0

I have a problem with fetching value from database document to a variable called in initState method. When I am doing that there is a problem with null value and I think that get() method from Firebase is taking the value too late(it happens when i reload the scene).

  bool _dark;
  bool options;
  MainModel model;
  final MyUser myUser;
  final UserSettings userSettings;

  _SettingsOnePageState(this.userSettings, this.myUser);

  final user = FirebaseAuth.instance.currentUser;
  @override
  void initState() {
    super.initState();
    // _dark = false;
    FirebaseFirestore.instance
        .collection("settings")
        .doc(user.uid)
        .get()
        .then((value) {
      print(value.data()['darkMode']);
      _dark = value.data()['darkMode'];
    });
    options = false;
  }

  Brightness _getBrightness() {
    return _dark ? Brightness.dark : Brightness.light;
  }

@override
  Widget build(BuildContext context) {
    return Theme(
        // return StreamProvider<QuerySnapshot>.value(
        isMaterialAppTheme: true,
        data: ThemeData(
          brightness: _getBrightness(),
        ),
        // value: SettingsUser().settings,
        child: StreamBuilder<UserSettings>(
            //setting the stream for settings from database
            stream: DatabaseUser(userId: user.uid).userData,
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                //data for user from database
                UserSettings userSettings = snapshot.data;
                // _dark = userSettings.darkMode;
                // print("dark mode " + userSettings.darkMode.toString());
                return Form(
                    key: _formKey,
                    child: Scaffold(
                        backgroundColor: _dark ? null : Colors.grey.shade200,
                        appBar: AppBar(
                          //elevation: 10,
                          brightness: _getBrightness(),
                          iconTheme: IconThemeData(
                              color: _dark ? Colors.white : Colors.black),
                          backgroundColor: Colors.transparent,
                          title: Text(
                            'Change theme',
                            style: TextStyle(
                                color: _dark ? Colors.white : Colors.black),
                            textAlign: TextAlign.center,
                          ),
                          actions: <Widget>[
                            IconButton(
                              icon: Icon(Icons.auto_awesome),
                              onPressed: () {
                                setState(() {
                                  _dark = !_dark;
                                });
                              },
                            )
                          ],
                        ),
                        body: Stack(fit: StackFit.expand, children: <Widget>[
                          SingleChildScrollView(
                              //padding: const EdgeInsets.all(16.0),
                              child: Column(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: <Widget>[
                                Stack(
                                  children: <Widget>[
                                    Align(
                                        alignment: Alignment.center,
                                        child: Text(
                                          userSettings.nick,
                                          textScaleFactor: 4,
                                          style: TextStyle(
                                            color: _dark
                                                ? Colors.white
                                                : Colors.purple[500],
                                            //fontWeight: FontWeight.w500,
                                          ),
                                        )),
                                    const SizedBox(height: 50.0),
                                  ],
                                ),
                                Stack(
                                  children: <Widget>[
                                    Align(
                                      alignment: Alignment.center,
                                      child: Container(
                                        // width: 200,
                                        // height: 200,
                                        child: CircleAvatar(
                                          radius: 100.0,
                                          backgroundImage:
                                              //NetworkImage(user.photoURL),
                                              NetworkImage(
                                                  userSettings.pictureUrl),
                                        ),
                                      ),
                                    ),
                                  ],
                                ),
                                //const SizedBox(height: 20.0),
                                if (options == true) ...[
                                  //SettingsEdit(),
                                  //NickChange(),
                                  ImageInput(),
                                ],
                                const SizedBox(height: 10.0),
                                Card(
                                  elevation: 4.0,
                                  margin: const EdgeInsets.fromLTRB(
                                      32.0, 8.0, 32.0, 16.0),
                                  shape: RoundedRectangleBorder(
                                      borderRadius:
                                          BorderRadius.circular(10.0)),
                                  child: Column(
                                    children: <Widget>[
                                      ListTile(
                                        leading: Icon(
                                          Icons.account_box,
                                          color: Colors.purple,
                                        ),
                                        title: Text("Change Nickname"),
                                        trailing:
                                            Icon(Icons.keyboard_arrow_right),
                                        onTap: () {
                                          //open change nick
                                          //changeNick();
                                        },
                                      ),
                                      _buildDivider(),
                                      ListTile(
                                        leading: Icon(
                                          Icons.add_a_photo,
                                          color: Colors.purple,
                                        ),
                                        title: Text("Change Photo"),
                                        trailing:
                                            Icon(Icons.keyboard_arrow_right),
                                        onTap: () {
                                          //open change photo
                                          //changePhoto();
                                        },
                                      ),
                                      _buildDivider(),
                                      ListTile(
                                        leading: Icon(
                                          Icons.lock_rounded,
                                          color: Colors.purple,
                                        ),
                                        title: Text("Change Password"),
                                        trailing:
                                            Icon(Icons.keyboard_arrow_right),
                                        onTap: () {
                                          //open change password
                                          //changePassword();
                                        },
                                      ),
                                      _buildDivider(),
                                      ListTile(
                                        leading: Icon(
                                          Icons.location_on,
                                          color: Colors.purple,
                                        ),
                                        title: Text("Change Your Location"),
                                        trailing:
                                            Icon(Icons.keyboard_arrow_right),
                                        onTap: () {
                                          //open change location
                                        },
                                      ),
                                    ],
                                  ),
                                ),
                                const SizedBox(height: 20.0),
                              ]))
                        ])));
              }
              return Scaffold();
            }));
  }

debug console settings where I use theme now

Do you know how to avoid this null in initState? I am trying to change theme of the app and I am taking that from Firebase document whick I created when the user registered. Than I will be changing it in user settings and also want to use it(this theme) in whole app. Thanks for help

1 Answer 1

1

InitState is not async (meaning execution doesn't wait for your firebase call to complete). This means that your view will be rendered before you assign _dark a value.

If you want to wait until that call is complete, use something called FutureBuilder.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.