Desafio Piperun
O app utiliza GetIt para injecao de dependencia, como pattern de Service Locator, devido ao Flutter nao suportar injecao via construtor sem plugins de geração de código.
Para gerenciamento de estado, não foi necessária a utilização de um padrao mais complexo, pois as telas são de baixa complexidade e poucas atualizações de widgets únicos, embora eu tenha familiaridade com o Provider Model (nova recomendação da Google);
Para conexao com as APIs foi utilizado o plugin DIO, para controle de tokens, encoding, e endpoints.
O app foi organizado de maneira similar ao MVVM utilizado no Xamarin:
A Pasta views contém as views (páginas e user interfaces) da aplicação, juntamente das ViewModels(controlam o estado da View, eventos (botoes, etc), e variáveis);
A Pasta services contém métodos e classes que podem ser utilizados por qualquer viewModel, como chamados de API e dialogs neste app, e em outros casos, armazenamento de configuracoes de usuarios e regras de negocio;
A pasta models contém os modelos utilizados (PODO), e seus metodos para conversao JSON (toJson e fromJson), é utilizado serialização manual, pois bibliotecas de mapeamento automatico de JSON necessitam de geracao de código e nao permitem o debug em tempo real no caso de alteracoes do app;
_shared contém a injecao de dependencia e estilos utilizado nos widgets do aplicativo
todos os views possuem um routeName, para navegação de páginas através de rotas loginView é o route inicial do app, apos o login, homeView é configurado como rota inicial
Geralmente as views possuem 2 estados: carregando e carregado, onde é exibida uma tela de loading enquanto os dados a serem exibidos ainda nao foram completamente carregadoss