Я пытаюсь сохранить прогресс, он же «карточки». https://pub.dev/packages/fsrs
Я не могу сериализовать это, потому что это не карта, я думаю.
Поэтому следующий код не работает.
import 'package:fsrs/fsrs.dart';
import 'dart:convert';
void main() {
var f = FSRS();
var card = Card();
var now = DateTime(2022, 11, 29, 12, 30, 0, 0);
print("Now: $now");
var schedulingCards = f.repeat(card, now);
// printSchedulingCards(schedulingCards);
var encoded = json.encode(card);
print(encoded);
}
Этот код дает: Отклонение обещания с ошибкой: Не удалось преобразовать объект в кодируемый объект: Экземпляр «Card».
Я думаю, преобразование в json было бы неплохой идеей, потому что, если позже я попытаюсь сохранить его в Firestore, он будет работать хорошо.
Я могу поместить .toString() после карты и преобразовать ее в json, но понятия не имею, как преобразовать ее обратно в «карту».
import 'package:fsrs/fsrs.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'dart:convert';
void main() {
var f = FSRS();
var card = Card();
var now = DateTime(2022, 11, 29, 12, 30, 0, 0);
print("Now: $now");
var schedulingCards = f.repeat(card, now);
// printSchedulingCards(schedulingCards);
var encoded = json.encode(card.toString());
print(encoded);
}
это дает:
"{\"due\":\"2024-04-29 12:23:55.302Z\",\"stability\":0,\"difficulty\":0,\"elapsedDays\":0,\"scheduledDays\":0,\"reps\":0,\"lapses\":0,\"state\":\"State.newState\",\"lastReview\":\"2024-04-29 12:23:55.302Z\"}"
Пожалуйста, помогите мне вернуть карту из сохраненного состояния. Спасибо!
Если вы не являетесь участником пакета fsrc
, вы можете использовать расширение для Card
добавления, например. геттер toJson
и статический метод fromJson
, который возвращает новый экземпляр Card
:
import 'package:fsrs/fsrs.dart';
import 'dart:convert';
extension CardHelper on Card {
/// Returns a map representation of this.
Map<String, dynamic> get toJson => {
'due': due.toIso8601String(),
'stability': stability,
'difficulty': difficulty,
'elapsedDays': elapsedDays,
'scheduledDays': scheduledDays,
'reps': reps,
'state': state.toString(),
'lastReview': lastReview.toIso8601String()
};
/// Converts a map to an object of type `Card`.
static Card fromJson(Map<String, dynamic> json) {
// Validate input
if (json
case {
'due': String due,
'stability': double stability,
'difficulty': double difficulty,
'elapsedDays': int elapsedDays,
'scheduledDays': int scheduledDays,
'reps': int reps,
'state': String state,
'lastReview': String lastReview
}) {
return Card()
..due = DateTime.parse(due)
..stability = stability
..difficulty = difficulty
..elapsedDays = elapsedDays
..scheduledDays = scheduledDays
..reps = reps
..state = State.values
.firstWhere((element) => element.toString() == state.toString())
..lastReview = DateTime.parse(lastReview);
} else {
throw JsonUnsupportedObjectError(json,
cause: 'In CardHelper.fromJson: '
'Validation failed!');
}
}
}
void main() {
final f = FSRS();
final card = Card();
final now = DateTime(2022, 11, 29, 12, 30, 0, 0);
print("Now: $now");
var schedulingCards = f.repeat(card, now);
print(card);
final jsonString = json.encode(card.toJson);
final clonedCard = CardHelper.fromJson(json.decode(jsonString));
print(clonedCard);
}
Ниже приведен вывод консоли, сгенерированный при запуске main
:
$ dart main.dart
Now: 2022-11-29 12:30:00.000
{"due":"2024-04-29 15:13:06.341169Z","stability":0.0,"difficulty":0.0,"elapsedDays":0,"scheduledDays":0,"reps":0,"lapses":0,"state":"State.newState","lastReview":"2024-04-29 15:13:06.341664Z"}
{"due":"2024-04-29 15:13:06.341169Z","stability":0.0,"difficulty":0.0,"elapsedDays":0,"scheduledDays":0,"reps":0,"lapses":0,"state":"State.newState","lastReview":"2024-04-29 15:13:06.341664Z"}
Я настоятельно рекомендую создать заявку с просьбой к авторам fsrs
добавить методы toJson
и конструктор Card
Card.fromJson(Map<String, dynamic> json)
. Это решит вашу проблему и поможет другим пользователям данного пакета.
Большое спасибо! Мне потребовалась бы целая вечность, чтобы понять это.
Обновление: Начиная с fsrs
версии 1.1.1, класс Card
предоставляет конструктор фабрики Card.fromJson
, а также метод toJson()
.
Вы читали: docs.flutter.dev/data-and-backend/serialization/json