Как вы создаете Услуги / Провайдеров во Флаттере?

Допустим, мне нужен пользовательский сервис, который имеет все мои пользовательские переменные и функции, и другой сервис элементов со всеми переменными и функциями элементов и т. Д. И т. Д. Я хочу, чтобы все эти данные и функции были доступны по всему проекту, передавая пользовательские данные там, где это необходимо, например.

Я подозреваю, что это как-то связано с унаследованными виджетами, но как это работает? Например, я вижу, как я мог бы использовать один унаследованный виджет на корневом уровне, но должен ли я создавать набор унаследованных виджетов на корневом уровне для каждого сервиса? Или просто поместить ВСЕ данные в один верхний унаследованный виджет? Похоже, что это может стать грязным. Я еще не видел пример этого.

... или я должен просто использовать класс со статическими переменными и вызывать его там, где он мне нужен?

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 вызывается только при ее изменении, поэтому это всегда тривиально.)

Другие вопросы по тегам