#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: ссылка Итак, попробуйте найти различия, его так долго не трогали, что я не могу вам сильно помочь. Это было мое первое приложение, которое я попытался создать полностью самостоятельно, не полагаясь на обучающие видеоролики (курс). Итак, на данный момент это очень плохо.