Как получить и установить значения двух разных типов данных в общих настройках во флаттере? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть карта с именем cardDetails, данные которой получены из пожарного магазина. После того, как данные извлечены, я хочу использовать shared_preferences для локального сохранения деталей путем преобразования карты в строку и установки ключа в значение true. Когда пользователь снова открывает приложение, я проверяю, было ли значение прочитано с помощью getBool(key), а затем извлекаю данные из строки с помощью getString(key).

Проблема в том, что getString (key) возвращает значение bool вместо строки, из-за чего я не могу декодировать строку для сопоставления снова

════════ Exception caught by widgets library ═══════════════════════════════════════════════════════
The following assertion was thrown building:
type 'bool' is not a subtype of type 'String'

Декларация и инициализация

Map<String, dynamic> cardDetails;
  var keys;
  bool _initialSharedValue;

  @override
  void initState() {
    super.initState();

    SharedPreferences.getInstance().then((SharedPreferences sp) {
      sharedPreferences = sp;
      _initialSharedValue = sharedPreferences.getBool("homepage");
      // will be null if never previously saved
      if (_initialSharedValue == null) {
        _initialSharedValue = false;
        persist(_initialSharedValue); // set an initial value
      }
      setState(() {});
    });
  }

  Future<void> persist(bool value) async {
    setState(() {
      _initialSharedValue = value;
    });
    await sharedPreferences?.setBool("homepage", value);
  }

  storeCardInSharedPreference(Map cardDetails) async {
    await sharedPreferences?.setString("homepage", json.encode(cardDetails));
  }

В пользовательском интерфейсе для построения карт

    if (sharedPreferences.getBool("homepage"))
      ListView.builder(
        itemBuilder: (context, index) {
          cardDetails = json.decode(sharedPreferences.getString("homepage"));
          return HomepageCards(
            user: widget.user,
            cardDetails: cardDetails[cardDetails.keys.toList()[index]],
          );
        },
        itemCount: 3,
        scrollDirection: Axis.vertical,
        controller: _controller,
        shrinkWrap: true,
      )
    else
      StreamBuilder<DocumentSnapshot>(
        stream: Firestore()
            .collection('homepage')
            .document(widget.user.uid)
            .collection('h')
            .document('28032020')
            .snapshots(),
        builder: (context, snapshot) {
          if (snapshot.data != null) {
            cardDetails = {};
            snapshot.data.data.forEach((index, individualDetail) {
              cardDetails[index] = individualDetail;
            });
            storeCardInSharedPreference(cardDetails);
            sharedPreferences.setBool("homepage", true);
            keys = snapshot.data.data.keys;
          } else {
            // TODO: Convert it to Shimmer with card skeletal layout
            CircularProgressIndicator();
          }

          return ListView.builder(
            itemBuilder: (context, index) {
              return HomepageCards(
                user: widget.user,
                cardDetails:
                    cardDetails[cardDetails.keys.toList()[index]],
              );
            },
            itemCount: keys.length,
            scrollDirection: Axis.vertical,
            controller: _controller,
            shrinkWrap: true,
          );
        },
      )

1 Ответ

0 голосов
/ 07 апреля 2020

Я решил проблему с помощью ? в условии if, чтобы сделать вызов метода нулевым.

if (sharedPreferences?.getBool("homepage"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...