BLoC: как пройти? - PullRequest
       10

BLoC: как пройти?

1 голос
/ 16 мая 2019

Я хотел бы знать, как лучше пройти блок. Я читал о поставщиках блоков, но в чем разница между их использованием и передачей блока в конструкторе, например:

ExampleView X = ExampleView(bloc,...)

На самом деле я считаю, что этот способ проще для тестирования, а также лучший способ сохранить чистоту кода. Например, если у меня есть больше блоков, может произойти что-то подобное:

XBlocProvider(
                  bloc: XBloc,
                  child: YBlocProvider(
                      bloc: Y,
                      child: ZBlocProvider...
                    )

или, может быть, это просто отсутствие у меня знаний. Итак, какие преимущества?

Ответы [ 3 ]

2 голосов
/ 16 мая 2019

Проблема с этим:

ExampleView X = ExampleView(bloc,...)

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

Этот подход действителен, только если ваш блок связан только с одной конкретной страницей, но обычно вам требуется статический BLoC. Вот почему мы используем InheritedWidget, потому что Flutter сохраняет все InheritedWidget в памяти. При таком подходе вы создаете экземпляр один раз и используете его везде, не теряя ни одного сеанса, что также эффективно с точки зрения производительности. Конечно, вы можете использовать синглтон, но при этом вы не станете другом:)

Слишком много подходов, но команда Flutter только что объявила, что предлагает этот пакет: https://pub.dev/packages/provider

С помощью этого пакета вы можете добавить несколько блоков, например, если вы не хотите каскадного огромного дерева:

MultiProvider(
  providers: [
    Provider<Foo>.value(value: foo),
    Provider<Bar>.value(value: bar),
    Provider<Baz>.value(value: baz),
  ],
  child: someWidget,
)

В конце постарайтесь осмыслить каждый подход, особенно советую вам разобраться в этой статье:

https://www.didierboelens.com/2018/12/reactive-programming---streams---bloc---practical-use-cases/

Вы поймете, когда использовать блок с провайдером или как единое целое или как экземпляр, как в вашем примере и т. Д.

0 голосов
/ 16 мая 2019

Преимущество использования провайдера заключается в отсутствии необходимости передавать блок в конструкторе. Это уменьшает сложность вашего приложения, позволяя вам распространять информацию по дереву виджетов с помощью InheritedWidget . Все, что вам нужно, это получить доступ к блоку из дочернего виджета с помощью BlocProvider.of(context).

0 голосов
/ 16 мая 2019

Первое отличие заключается в том, как вы получаете доступ к блоку из виджета.

  • когда вы передаете его через конструктор, у вас есть прямой доступ к нему
  • когда вы используете BlocProvider, тогда, в большинстве случаев, в зависимости от вашей реализации bloc, вы получаете его черезProvider, который расширяет InheritedWidget, используя context, например:
final xBloc = Provider.of<XBloc>(context);

Более того, когда вы обертываете свой bloc с помощью BlocProvider, тогда область действия bloc ограниченак поддереву этого виджета, поэтому к нему могут обращаться только потомки BlocProvider.

...