Я создал UserModel через ScopedModel для всех пользовательских данных текущего пользователя, вошедшего в систему.Данные загружаются в модель UserModel из Firebase / Firestore async (Future).Теперь я хочу получить доступ к переменным везде в моем приложении.Так, например, у меня есть еще один вызов Firestore в моем приложении, которому нужен идентификатор пользователя.Когда я сейчас пытаюсь загрузить переменные, они представляют собой Instance of Futures или null (я должен их ждать).Я знаю, что могу как-то их ждать в каждом initState.Но я думаю, что это неправильное решение.Любая идея, что делать?
Пример: здесь мне нужен userId
FutureBuilder(future: Firestore.instance
.collection('users')
.document(model.userId.toString())
.get(), etc...
Я загружаю данные модели в начале приложения.дерево
void main() async{
var model = new UserModel();
await model.loadData();
runApp(new ChatHere());
}
Теперь пользовательская модель выглядит следующим образом.
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:scoped_model/scoped_model.dart';
class UserModel extends Model {
bool _isLoading = true;
bool get isLoading => _isLoading;
String _name;
String get name => _name;
String _avatarUrl;
String get avatarUrl => _avatarUrl;
Timestamp _creationDate;
Timestamp get creationDate => _creationDate;
List _myGroups;
List get myGroups => _myGroups;
// Get the ID of the currently logged in user
Future<String> loadUserId() async {
FirebaseUser user = await FirebaseAuth.instance.currentUser();
return user != null ? user.uid.toString() : null;
}
// Load user data
Future loadData() async {
// Set model to loading
_isLoading = true;
// Notify listeners
notifyListeners();
DocumentReference reference =
Firestore.instance.collection('users').document(await loadUserId());
DocumentSnapshot snapshot = await reference.get();
_name = await snapshot['nickname'];
_avatarUrl = await snapshot['avatarUrl'];
_creationDate = await snapshot['timestamp'];
_myGroups = await snapshot['myGroups'];
// Set loading to false = data is loaded
_isLoading = false;
// Notify listeners. Data is ready
notifyListeners();
}
}