Flutter initState ждет завершения асинхронной функции c - PullRequest
0 голосов
/ 15 апреля 2020

в моем main.dart у меня есть, среди прочего, эти две функции:

    Future<void> _fetchMasterData() async {
    print("Start fetch");
    var jwt = await API.attemptLogIn();
    if (jwt != null) {
      Map<String, dynamic> answer = jsonDecode(jwt);
      if (answer['message'] == 'Auth ok') {
        jwtToken = 'Bearer ' + answer['token'];
      }
    }

    await _getArticles();
    await _getMainCategories();
    await _getIngredients();
    await _getArticleIngredients();
    print("EndMasterData fetch");
  }

И

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

То, что я хотел бы иметь, это ждать в initState до выполнения _fethcMasterData bevore Widgert build называется.

Возможно ли это? Большое спасибо за любую помощь!

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Вот как я могу использовать asyn c fun c initstate;

 builder() async {
    favoriteDatabase =
    await $FloorFavoriteDatabase.databaseBuilder('favorite_database.db')
        .build();
    setState(() {
      favoriteDao = favoriteDatabase.favoriteDao;
    });
  }


  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      WidgetsBinding.instance.addPostFrameCallback((_) =>
          getNamePreferences().then(updateName));
    });
    builder();
    favoriteDao.findAllMoviesAsStreamW();
    favoriteDao.findAllMoviesAsStream();
  }

Также вы можете проверить эту мини-статью тоже.

0 голосов
/ 15 апреля 2020

невозможно ждать в initState, поэтому, когда вы завершите sh весь процесс загрузки, вы можете вызвать метод SetState, который заполнит ваш виджет фактическими данными.

Второе решение Можно использовать futurebuilder или streambuilder, где вы хотите показать данные, но это возможно только в том случае, если данные какого-либо метода не зависят друг от друга.

 Future<void> _fetchMasterData() async {
    print("Start fetch");
    var jwt = await API.attemptLogIn();
    if (jwt != null) {
      Map<String, dynamic> answer = jsonDecode(jwt);
      if (answer['message'] == 'Auth ok') {
        jwtToken = 'Bearer ' + answer['token'];
      }
    }

    await _getArticles();
    await _getMainCategories();
    await _getIngredients();
    await _getArticleIngredients();
    print("EndMasterData fetch");
    SetState((){});  // added line
  } 
...