#flutter #boolean
#флаттер #логическое значение
Вопрос:
Эй, я создаю любимую систему с помощью bool, чтобы указать, является ли она любимой или нет.
Но если имя bool всегда одно и то же, оно применяется ко всем моим записям!
но каждая запись имеет свое собственное имя (widget.name ), и я подумал, что, может быть, что-то подобное могло бы сработать
bool widget.name;
но это не сработает:(
как я могу решить, что каждая запись имеет свой собственный bool?
кстати, я использую этот плагин для этого https://pub.dev/packages/shared_preferences/example
SharedPreferences sharedPreferences;
bool isfavorit;
@override
void initState() {
super.initState();
SharedPreferences.getInstance().then((SharedPreferences sp) {
sharedPreferences = sp;
isfavorit = sharedPreferences.getBool(spKey);
// will be null if never previously saved
if (isfavorit == null) {
isfavorit = false;
persist(isfavorit); // set an initial value
}
setState(() {});
});
}
void persist(bool value) {
setState(() {
isfavorit = value;
});
sharedPreferences?.setBool(spKey, value);
}
Полный код
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class Details extends StatefulWidget {
final String name;
Details(
this.name,
);
@override
_DetailsState createState() => _DetailsState();
}
const String spKey = 'myBool';
class _DetailsState extends State<Details> {
SharedPreferences sharedPreferences;
bool isfavorit;
@override
void initState() {
super.initState();
SharedPreferences.getInstance().then((SharedPreferences sp) {
sharedPreferences = sp;
isfavorit = sharedPreferences.getBool(spKey);
// will be null if never previously saved
if (isfavorit == null) {
isfavorit = false;
persist(isfavorit); // set an initial value
}
setState(() {});
});
}
void persist(bool value) {
setState(() {
isfavorit = value;
});
sharedPreferences?.setBool(spKey, value);
}
// ignore: missing_return
IconData favicon() {
if (isfavorit == true) {
return Icons.favorite;
} else if (isfavorit == false) {
return Icons.favorite_border;
}
}
// ignore: missing_return
Color favicolor() {
if (isfavorit == true) {
return Colors.red;
} else if (isfavorit == false) {
return Colors.white;
}
}
void changefav() {
if (isfavorit == true) {
return persist(false);
} else if (isfavorit == false) {
return persist(true);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: [
IconButton(
icon: Icon(
favicon(),
color: favicolor(),
),
onPressed: () => changefav(),
),
],
title: Text(widget.name),
),
body: Container(
child: Text(widget.name),
),
);
}
}
Комментарии:
1. Пожалуйста, поделитесь соответствующим кодом, который у вас есть.
2. Можете ли вы поделиться всем виджетом
3. Обновите сообщение
Ответ №1:
Вы всегда сохраняете isFavorite
один и тот же ключ в общих настройках, вместо использования постоянного ключа используйте тот, который основан на widget.name
Так, например:
sharedPreferences.getBool('details_favorite_${widget.name}');
Комментарии:
1. где именно я должен его использовать или заменить?
2. везде, где вы используете
spKey
, используйте'details_favorite_${widget.name}'
вместо3. Приятно, что сработало 🙂 теперь, как я могу загрузить все сохраненные имена bool в список, используя listbuilder? а на другой странице?
4. Проверьте метод getKeys общих настроек
5. хорошо, спасибо, но я все еще новичок, не могли бы вы дать мне пример кода, как я могу это реализовать?