SharedPreference возвращает нулевое колебание

#flutter

#ошибка

Вопрос:

Я хочу отобразить что-то из общих настроек.

Вот мой код :

 return FutureBuilder<ChildModel>(
      future: sharedPreference.getData(),
      builder: (context, snapshot) {
        print("SNAPSHOT"   snapshot.data.toString());
        if (snapshot.hasData amp;amp;
            snapshot.data != null) {
          return _render(snapshot,context);
        } else if (snapshot.hasError) {
          return Text("${snapshot.error}");
        } else {
          return Text('Select Vehicle');
        }
      },
    );
  

Мой SharedPreferece:

 Future<ChildModel> getData() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();

    ChildModel singleObject ;
    List<ChildModel> userVehicleList = [];

    getSelectedVehicleID().then((onValue){
      if(onValue!=null){
        if (prefs.get(_kUserVehicles) != null) {
          final List parsedList = json.decode(prefs.get(_kUserVehicles));
          userVehicleList =  parsedList.map<ChildModel>((val) =>  ChildModel.fromJson(val)).toList();
        }


        for (int i = 0; i < userVehicleList.length; i  ) {
          if (userVehicleList[i].id == onValue) {
            singleObject = userVehicleList[i];
          }
        }
      }
    });

    return singleObject ?? null;
  }
  

Проблема в том, что singleObject = userVehicleList[i] выполняется, но ничего не возвращает.

В Future Builder всегда snapshot.data равно null.

Я хочу вернуть тот singleObject, который я нашел в этом цикле.

Кто-нибудь, пожалуйста, может мне помочь с этим???

Комментарии:

1. где находится часть, в которой вы сохраняете общие настройки?

2. Я не сохраняю это, я просто получаю соответствующий объект из списка. Сохранение и возврат списка list работает нормально.

3. возможно, вы пытаетесь извлечь данные, но в них нет данных с ключом. добавить?? вот так и попробуйте. окончательный список parsedList = json.decode(prefs.get(_kUserVehicles) ?? 0);

Ответ №1:

Вы не ожидаете завершения future перед возвратом значения.

Итак

     return singleObject ?? null;
  

будет выполняться до

 getSelectedVehicleID()
  

Что вам нужно, так это

 int _selectedVehicleId = await getSelectedVehicleID();
  

А затем продолжайте получать что-либо из общих настроек и возвращать это.

Надеюсь, это поможет 🙂