У меня есть карта с именем 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,
);
},
)