Не удается присвоить значение данных строке — возвращает значение null — flutter

#firebase #flutter #dart #google-cloud-firestore

# #firebase #флаттер #dart #google-cloud-firestore

Вопрос:

В моем коде я пытаюсь присвоить строковое значение пустой строке и отобразить на странице, но оно продолжает показывать значение null, но когда я его распечатываю, оно показывает значение.

 String fName = '';

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

getData() async {
    FirebaseAuth _auth = FirebaseAuth.instance;
    User _firebaseUser = _auth.currentUser;
    print("============ MyHome ================");
    print(_firebaseUser.uid);
    _currentUser = await Database().getUserData(_firebaseUser.uid);
    if (_currentUser != null) {
      fName = _currentUser.firstName;
      print(_currentUser.firstName);
    } 
  }
 

База данных

 Future<UserData> getUserData(String uid) async {
    UserData returnValue = UserData();

    try {
      DocumentSnapshot _docSnapshot =
          await _firestore.collection("users").doc(uid).get();
      returnValue.uid = uid;
      returnValue.firstName = _docSnapshot.data()["firstName"];
      returnValue.lastName = _docSnapshot.data()["lastName"];
      returnValue.userMail = _docSnapshot.data()["userMail"];
      returnValue.userType = _docSnapshot.data()["userType"];
      print("====================== on getData =============");
      print(returnValue.firstName);
    } catch (e) {
      print(e);
    }

    return returnValue;
  }
 

И всякий раз, когда я пытаюсь отобразить данные, которые он мне дает null

 Text("Hello, $fName"),
 

Пожалуйста, как мне это сделать или я что-то упустил

Ответ №1:

используется setState для перестроения дерева виджетов со значением:

 setState(() { 
fName = _currentUser.firstName;
});
 

Ответ №2:

Поскольку функция getData является асинхронной, flutter уже построил дерево виджетов до завершения getData. Теперь вам нужно будет обновить состояние с помощью setstate .

 setState(() {
   fName = _currentUser.firstName;
});
 

Ответ №3:

Вам необходимо установить новое состояние, поскольку мы внесли изменения в предыдущее состояние (поскольку ваша функция getData является асинхронной.

 setState(() {
   fName = _currentUser.firstName;
});