Обновление пользовательского интерфейса при загрузке приложения с данными из общих настроек

#flutter #dart #sharedpreferences

#flutter #dart #sharedpreferences

Вопрос:

Мне удалось сохранить свои данные, используя общие настройки. При загрузке приложения (после его закрытия) данные загружаются корректно в фоновом режиме, но пользовательский интерфейс не обновляется при запуске.

Пользовательский интерфейс по умолчанию отображается до тех пор, пока пользователь не нажмет на дату. Кроме этого, отметки для дат с заданным весом также не отображаются.

Я понятия не имею, что с этим делать. Вот демонстрация того, в чем проблема:

Пользовательский интерфейс не обновляется в соответствии с сохраненными данными (общие настройки)

 class UserWeight {
  int id;
  final String weight;
  double totalWeight = 0.0;
  final String date;
  String jsonString;
  var listOfWeights = [];

  UserWeight({this.weight, this.date});

  void addWeight(String dt, String wt) {}

  void removeWeight(String dt) {}
  }

  String getWeight(String dt) {
    if (listOfWeights != null) {
      for (var v in listOfWeights) {
        if (v.containsKey('date')) {
          if (v['date'] == dt) {
            return double.parse(v['weight']).toString();
          }
        }
      }
    }
    return kNoWeightText; // If there is no weight for given date
  }

  String serialize() {
    jsonString = jsonEncode(listOfWeights);
    return jsonString;
  }

  read() async {
    final prefs = await SharedPreferences.getInstance();
    // var b = List<Map<String, dynamic>>.from(jsonDecode(jsonString));
    List<dynamic> s = jsonDecode(prefs.getString('listOfWeights') ?? []);
    listOfWeights = s;
    print("====START OF DECODE===");
    print(listOfWeights);
    for (var v in listOfWeights) {
      print(v);
    }
    print("====END OF DECODE===");
  }

  saveData() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setString('listOfWeights', serialize());
  }
}

 

Домашняя страница () — это первое, что загружается после main.dart

 class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
   // Other variables;
   UserWeight uw = new UserWeight();

   @override
   void initState() {
       uw.read();
   }
   void dispose() {}
   .....
   // this is called by builder:CalendarBuilders() of the TableCalendar() widget.
   Widget _buildEventsMarker(DateTime date, List events) {
    
    // this creates the tick marks... or it is supposed to do so.
    // events parameter is not used
    return AnimatedContainer(
      duration: const Duration(milliseconds: 300),
      width: 25.0,
      height: 25.0,
      child: Center(
        child: Icon(
          uw.getWeight(date.toString()) != kNoWeightText ? Icons.check : null,
          color: Colors.green,
        ),
      ),
    );
  }
}

 

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

Спасибо.

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

1. Где вы вызываете метод read() ??

2. в initState(){}

3. Выполняете ли вы setState() после этого?

4. Нет. Он выдает setState(), вызываемый во время ошибки сборки.

Ответ №1:

Из того, что я понял, это может сработать:

       class _MyHomePageState extends State<MyHomePage> with TickerProviderStateMixin {
        // Other variables;
        UserWeight uw = new UserWeight();

        @override
        void initState() {
          getData();
        }

        getData() async{
          await uw.read();
          if(mounted){
            setState(() {});
          }
        }
        Widget _buildEventsMarker(DateTime date, List events) {
          
          // this creates the tick marks... or it is supposed to do so.
          // events parameter is not used
          return AnimatedContainer(
            duration: const Duration(milliseconds: 300),
            width: 25.0,
            height: 25.0,
            child: Center(
              child: Icon(
                uw.getWeight(date.toString()) != kNoWeightText ? Icons.check : 
                                 null,
                color: Colors.green,
              ),
            ),
          );
        }
      }
 

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

1. Не обновляет пользовательский интерфейс при запуске, но значения загружаются в фоновом режиме (проверяется с помощью консоли).

2. Оно не будет загружено сразу после запуска приложения, загрузка займет некоторое время, поскольку оно асинхронное, тогда ваш пользовательский интерфейс должен отражать изменения.

3. Извините, но я сделал то, что вы сказали, но пользовательский интерфейс не обновляется, зеленые галочки не появляются.

4. @DoomLord вы смогли найти ответ. у меня такая же проблема

5. @AtharvSharma В то время как я в некоторой степени решил проблему и завершил это приложение. Он не поддерживался в течение длительного времени. В любом случае код для полного приложения доступен в моем профиле GitHub: ссылка Итак, попробуйте найти различия, его так долго не трогали, что я не могу вам сильно помочь. Это было мое первое приложение, которое я попытался создать полностью самостоятельно, не полагаясь на обучающие видеоролики (курс). Итак, на данный момент это очень плохо.