Как ожидать асинхронные данные ScopedModel в моем приложении? - PullRequest
0 голосов
/ 25 февраля 2019

Я создал 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();

  }
}
...