sobre a arquitetura Redux em aplicativos Flutter

Recentemente, houve um artigo sobre arquitetura limpa no Flutter. Eu quero cobrir o tópico de um ângulo ligeiramente diferente e desenvolver o tópico de gerenciamento de estado global com Redux.

E um pouco sobre mim: venho criando produtos comerciais há cerca de 10 anos, dos quais estou na Flutter há quase 2 anos, e tive tempo de experimentar todos os gestores estaduais famosos. Alguns evocam memórias neutras - BLoC, Provider, um bloco de classe global com seus próprios streams, e alguns negativos - MobX.

Como resultado, para mim, decidi pelo Redux para o estado global e bibliotecas para implementar a estrutura do aplicativo:

  • valor_construído

  • built_collection

  • rxdart (opcional)

  • flutter_simple_dependency_injection (ou dioc)

  • construído _ redux

Este é o meu conjunto mínimo de bibliotecas para implementar projetos de qualquer nível.

Agora passo a passo

Estrutura geral da aplicação

Estrutura geral da aplicação
Figura:  1. Estrutura geral do aplicativo
Figura: 1. Estrutura geral do aplicativo

  As pastas na raiz são todas padrão, criadas automaticamente, mas existem outras adicionais:

  • build.yaml - built_value,

  • analysis_options.yaml - . .

  • scripts - /// : , , , Flutter, . -. : prepare_app - Flutter, prepare_app_hover - hover. , ( ) dartfix -

  • application_bundle - . , JSON - - "" , , ..

-
Figura:  2. Um exemplo de pré-embaralhamento
. 2. -

Figura:  3. Um exemplo de um conjunto de scripts
. 3.

Flutter-

lib :

  • domain - : , , , , , ,

  • tools -

  • di - ,

  • features - UI , ,

  • services - , , ,

  • app - . MaterialApp CupertinoApp

  • app_routes.dart -

Domain

-
Figura:  4. Um exemplo de implementação do modelo de classe
. 4. -

  • actions

    built_redux Redux-

-
Figura:  5. Um exemplo de implementação de uma classe de modelo de ação
. 5. -

  • middlewares

, built_redux

-
Figura:  6. Um exemplo de implementação da classe de middleware
. 6. -

  • epics

    . built_redux. rxdart

-
Figura:  7. Um exemplo de implementação da classe épica
. 7. -

  • reducers

,

-
Figura:  8. Um exemplo de implementação de uma classe redutora
. 8. -

  • states

    Redux. - - AppState, : , .. built_redux

-
Figura:  9. Um exemplo de implementação de um estado de classe
. 9. -

DI

. flutter_simple_dependency_injection

Figura:  10. Um exemplo de implementação de inversão de dependências
. 10.

Features

- , . - blocs, components, widgets, tools. - widgets . (BLoC) - , . - - . StatefulWidget’

  • initState

  • - StreamBuilder’

  • dispose

components - -,

BLoC

- -. , di-. ,   -

BLoC
Figura:  11. Um exemplo de uma classe BLoC abstrata básica
. 11. BLoC

- BaseBloc .

BLoC-
Figura:  12. Um exemplo de uma classe BLoC
. 12. BLoC-

  :

  1. ,

  2. . / , , . , - (, , , ..), ( , , , nextSubstate)

-

Figura:  13. Um exemplo de método para chamar uma ação
. 13.

StreamBuilder:

Figura:  14. Alterações de estado de renderização
. 14.

, , , .

:

  1. . , . 300 2

  2. Redux , ,

:

  1. , , built_value “ ”

  2. Redux

  3. /

  4. . , 13 Flutter ,

  5. , UI - , ( Redux , )

E quero acrescentar que não existem projetos simples. Às vezes, um projeto de estimação se transforma em produtos comerciais. E então, após uma arquitetura projetada incorretamente, a operação normal pode se tornar impossível. Tenho um projeto, também no Flutter, que, por uma questão de interesse, tentei escrever através da arquitetura MobX. O projeto cresceu. Tornou-se, para dizer o mínimo, desconfortável trabalhar, tive que reescrever tudo no Redux.  

O objetivo deste artigo era chamar a atenção de desenvolvedores novatos ou experientes para uma arquitetura Redux que teve um bom desempenho em um produto comercial muito grande com dezenas de milhares de usuários diários. Ela sobreviveu e resistiu à chegada / saída de colegas, à introdução / remoção de vários recursos.




All Articles