Я бы рекомендовал определить супер-переменную для всего приложения, которая инициализируется при запуске приложения.
Например, main.dart
SharedPreferences prefs;
void main() async {
prefs = await SharedPreferences.getInstance();
return runApp(MyApp());
}
Затем вы можете передать prefs
переменная для любых других экранов / виджетов, где это необходимо в форме аргумента конструктора.Например,
class ContactsScreen extends StatefulWidget {
ContactsScreen({
Key key,
@required this.prefs,
}):
super(key: key);
final SharedPreferences prefs;
...
}
Вы, возможно, заметили в своем коде, что инициализация SharedPreferences
вызывается при каждом построении контакта в ListView
, за которым следует prefs.getStringList("Favourites")
вызов.
Эти 2 являются относительно тяжелыми операциями, которых можно избежать, если один раз определить массив избранных и использовать его для каждого вызова построения контакта.
Как бы я это сделал, это создать isFavourite
функцию в Contact
объекте, который принимает List<String>
в качестве аргумента.например,
class Contact {
...
bool isFavourite(List<String> favouriteIds) {
assert(favouriteIds != null);
return favouriteIds.contains(this.identifier);
}
...
}
и на экране контактов build
:
final List<String> favouriteIds = prefs.getStringList("Favourites") ?? []; // Use empty array in case `Favourites` is not set
...
ListTile(
// Show star next to Contact's name
leading: contact.isFavourite(favouriteIds) ? Icon(Icons.star) : null,
title: Text(contact.name);
);
...
Однако я должен предупредить вас, что я не знаю, насколько глобальным (/Переменные super / app-wide) обрабатываются в Dart / Flutter и рекомендуется ли объявлять метод main()
как async
, поэтому используйте его на свой страх и риск. (обновлено)
Исходя из моего личного опыта - проблем пока не возникало.
ОБНОВЛЕНО
Получается объявление main()
как async
, если совершенно безопасно .
Что касается глобальных переменных - мой метод в порядке, хотя есть , еще лучше .