Как сохранить пользовательскую «карточку» в общих настройках в dart/flutter?

Я пытаюсь сохранить прогресс, он же «карточки». 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\"}"

Пожалуйста, помогите мне вернуть карту из сохраненного состояния. Спасибо!

Вы читали: docs.flutter.dev/data-and-backend/serialization/json

Richard Heap 29.04.2024 17:17
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
2
1
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы не являетесь участником пакета 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 и конструктор CardCard.fromJson(Map<String, dynamic> json). Это решит вашу проблему и поможет другим пользователям данного пакета.

Большое спасибо! Мне потребовалась бы целая вечность, чтобы понять это.

My Name 30.04.2024 14:11

Обновление: Начиная с fsrs версии 1.1.1, класс Card предоставляет конструктор фабрики Card.fromJson, а также метод toJson().

Dan R 01.05.2024 11:46

Другие вопросы по теме