Как вы создаете Услуги / Провайдеров во Флаттере?
Допустим, мне нужен пользовательский сервис, который имеет все мои пользовательские переменные и функции, и другой сервис элементов со всеми переменными и функциями элементов и т. Д. И т. Д. Я хочу, чтобы все эти данные и функции были доступны по всему проекту, передавая пользовательские данные там, где это необходимо, например.
Я подозреваю, что это как-то связано с унаследованными виджетами, но как это работает? Например, я вижу, как я мог бы использовать один унаследованный виджет на корневом уровне, но должен ли я создавать набор унаследованных виджетов на корневом уровне для каждого сервиса? Или просто поместить ВСЕ данные в один верхний унаследованный виджет? Похоже, что это может стать грязным. Я еще не видел пример этого.
... или я должен просто использовать класс со статическими переменными и вызывать его там, где он мне нужен?
1 ответ
Смотрите ссылку, предоставленную Гюнтером выше. Если у вас есть тридцать минут, посмотрите презентацию Брайана Игана на DartConf 18: не усложняйте, заявите. Также см. Пример кода Брайана здесь. Он показывает то же приложение, закодированное с использованием InheritedWidget с контроллером и с Flutter Redux.
Вот пример одного InheritedWidget из моего простого приложения...
class StateContainer extends InheritedWidget {
final List<Membership> memberships;
final IntFunction getNextIndex;
final VoidMembershipFunction updateMembership;
final VoidIntFunction deleteMembership;
const StateContainer({
this.memberships,
this.getNextIndex,
this.updateMembership,
this.deleteMembership,
Widget child,
})
: super(child: child);
static StateContainer of(BuildContext context) {
return context.inheritFromWidgetOfExactType(StateContainer);
}
@override
bool updateShouldNotify(StateContainer oldWidget) {
return true;
}
}
Я передаю в мой MaterialApp, как ребенок. Большая часть дерева становится без сохранения состояния, поскольку у него есть доступ к данным и методам, если StateContainer. Вы можете думать о них как о своей модели и контроллере в одном. Методы сборки в дереве часто начинаются с...
@override
Widget build(BuildContext context) {
final StateContainer container = StateContainer.of(context);
чтобы получить к ним доступ.
Вы правы в том, что один InheritedWidget быстро становится громоздким - именно здесь вы можете инвестировать в изучение Redux - посмотрите последние 10 минут разговора. По моему опыту, область, которая становится самой грязной и быстрой, - это метод updateShouldNotify, когда заканчивается сравнение всех переменных-членов. (В этом простом примере есть только одна переменная-член, и setState вызывается только при ее изменении, поэтому это всегда тривиально.)