У меня есть вопрос об использовании асинхронной функции в initstate

#flutter #dart

#flutter #dart

Вопрос:

Я хочу инициализировать ‘Likeslist’, вызвав функцию init, которую я реализовал в initstate, и соответствующим образом отобразить связанные виджеты. Однако, когда он фактически выполняется, LikesList не может быть инициализирован, и, что любопытно, после выполнения горячей перезагрузки LikesList инициализируется. Как мне заставить LikesList нормально инициализироваться при первом запуске, как я хочу?

 List<String> LikesList = [];
  int ListIndex = 0;

  Future<List<String>> init() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    LikesList =  await prefs.getStringList('LikesList');
    ListIndex = await LikesList.length;
    print("${LikesList}");
  }

  @override
  void initState() {
    // TODO: implement initState
//    Future.delayed(Duration(milliseconds: 100)).then((_) {
//      init();
//    });

    Timer.run(() {
      init();//This is the function I implemented.
    });
    super.initState();
    print("        ${LikesList}");
  }
  

Ответ №1:

Как предложил @whatamelon, вы можете использовать FutureBuilder для достижения этой цели.

 Future<List<String>> init() async {
   final SharedPreferences prefs = await SharedPreferences.getInstance();
   return prefs.getStringList('LikesList');
}

@override
Widget build(BuildContext context) {
  return FutureBuilder(
    future: init(),
    builder: (ctx, snapshot) {
      if(snapshot.hasData) {
        print(snapshot.data);
        return Text("${snapshot.data}");
      }
      else
        return Text("loading");
      }
  );
}
  

Ответ №2:

Как насчет использования метода Future? Использование Future и Future builder позволяет получать данные в инициализированном состоянии.