Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Substituir ModularState por State em EscapeManualPage #362

Open
shonorio opened this issue Jan 11, 2025 · 1 comment
Open

Substituir ModularState por State em EscapeManualPage #362

shonorio opened this issue Jan 11, 2025 · 1 comment
Assignees
Labels
dependencies Pull requests that update a dependency file deprecation Para destacar o uso de componentes obsoletos good first issue Good for newcomers refactor Envolve melhorias no código, como substituir o componentes obsoletos

Comments

@shonorio
Copy link
Collaborator

Descrição

A classe _EscapeManualPageState e _TaskWidgetState atualmente utilizam ModularState para gerenciar o estado e a injeção de dependência do EscapeManualController. A proposta é substituir ModularState por State e injetar o EscapeManualController via passagem de parâmetro no construtor.

Motivação

  • Desacoplamento: Remover a dependência direta do flutter_modular para facilitar testes e reutilização do código.
  • Clareza: Tornar a injeção de dependência mais explícita, facilitando a compreensão do fluxo de dependências.
  • Manutenção: Simplificar a manutenção do código, evitando o uso de mixins desnecessários.

Alterações Propostas

  1. Substituir ModularState por State nas classes _EscapeManualPageState e _TaskWidgetState.
  2. Adicionar o EscapeManualController como parâmetro no construtor dessas classes.
  3. Remover a dependência do flutter_modular onde não for mais necessária.

Código Antigo

class _EscapeManualPageState
    extends ModularState<EscapeManualPage, EscapeManualController>
    with SnackBarHandler, AutomaticKeepAliveClientMixin {
  // ...
}

class _TaskWidgetState
    extends ModularState<_TaskWidget, EscapeManualController> {
  // ...
}

Código Novo

class _EscapeManualPageState extends State<EscapeManualPage>
    with SnackBarHandler, AutomaticKeepAliveClientMixin {
  final EscapeManualController controller;

  _EscapeManualPageState({required this.controller});

  // ...
}

class _TaskWidgetState extends State<_TaskWidget> {
  final EscapeManualController controller;

  _TaskWidgetState({required this.controller});

  // ...
}

Impacto

  • Testabilidade: Facilitará a criação de testes unitários, pois o EscapeManualController pode ser mockado diretamente.
  • Refatoração: Pode exigir ajustes em outros locais onde essas classes são instanciadas, para passar o controller como parâmetro.

Passos para Implementação

  1. Atualizar as classes _EscapeManualPageState e _TaskWidgetState conforme o código novo.
  2. Ajustar a instanciação dessas classes para passar o EscapeManualController como parâmetro.
  3. Remover a dependência do flutter_modular onde não for mais necessária.
  4. Atualizar os testes unitários para refletir as mudanças.

Exemplo de Uso

class EscapeManualPage extends StatefulWidget {
  final EscapeManualController controller;

  const EscapeManualPage({Key? key, required this.controller}) : super(key: key);

  @override
  State<EscapeManualPage> createState() => _EscapeManualPageState(controller: controller);
}

class _EscapeManualPageState extends State<EscapeManualPage>
    with SnackBarHandler, AutomaticKeepAliveClientMixin {
  final EscapeManualController controller;

  _EscapeManualPageState({required this.controller});

  // ...
}

Considerações Finais

Essa mudança promove boas práticas de engenharia de software, como injeção de dependência explícita e desacoplamento, além de melhorar a testabilidade e manutenção do código.


### Explicação das Alterações:
1. **Substituição de `ModularState` por `State`**: Remove a dependência do `flutter_modular` e torna o gerenciamento de estado mais explícito.
2. **Injeção de Dependência via Construtor**: O `EscapeManualController` é passado como parâmetro no construtor, tornando a dependência mais clara e facilitando testes.
3. **Remoção de Mixins Desnecessários**: Apenas os mixins realmente necessários (`SnackBarHandler` e `AutomaticKeepAliveClientMixin`) são mantidos.

Essa issue deve ser suficiente para guiar a refatoração necessária.
@shonorio shonorio added dependencies Pull requests that update a dependency file deprecation Para destacar o uso de componentes obsoletos refactor Envolve melhorias no código, como substituir o componentes obsoletos good first issue Good for newcomers labels Jan 11, 2025
@pedrox-hs pedrox-hs self-assigned this Jan 17, 2025
@pedrox-hs
Copy link
Member

@shonorio, com a alteração dessa maneira iremos fugir um pouco do padrão encontrado em referências de como implementar o State, com isso precisariamos desabilitar a regra no_logic_in_create_state do lint para não poluir nossos reports (VS Code, CI e etc).

Para não "relaxar" as regras de lint, como alternativa eu sugeriria que fosse utilizado um getter em vez de receber via construtor do State, o que acha?

class EscapeManualPage extends StatefulWidget {
  const EscapeManualPage({Key? key, required this.controller}) : super(key: key);

  final EscapeManualController controller;

  @override
  State<EscapeManualPage> createState() => _EscapeManualPageState();
}

class _EscapeManualPageState extends State<EscapeManualPage>
    with SnackBarHandler, AutomaticKeepAliveClientMixin {

  _EscapeManualPageState();

  EscapeManualController get controller => widget.controller;

  // ...
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
dependencies Pull requests that update a dependency file deprecation Para destacar o uso de componentes obsoletos good first issue Good for newcomers refactor Envolve melhorias no código, como substituir o componentes obsoletos
Projects
None yet
Development

No branches or pull requests

2 participants