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 na classe GuardiansPage #357

Open
4 tasks
shonorio opened this issue Jan 11, 2025 · 0 comments
Open
4 tasks

Substituir ModularState por State na classe GuardiansPage #357

shonorio opened this issue Jan 11, 2025 · 0 comments
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 GuardiansPage atualmente utiliza ModularState para gerenciar o estado e obter a instância do GuardiansController. A proposta é substituir ModularState por State e injetar o GuardiansController via passagem de parâmetro no construtor da classe.

Alterações Propostas

  1. Remover ModularState: A classe _GuardiansPageState não deve mais estender ModularState.
  2. Injeção de Dependência: O GuardiansController será passado como parâmetro no construtor da classe GuardiansPage.
  3. Ajustes no initState e dispose: Remover a dependência do Modular e ajustar o ciclo de vida do State.

Código Atual

class GuardiansPage extends StatefulWidget {
  const GuardiansPage({Key? key, this.title = 'Guardians'}) : super(key: key);

  final String title;

  @override
  _GuardiansPageState createState() => _GuardiansPageState();
}

class _GuardiansPageState
    extends ModularState<GuardiansPage, GuardiansController>
    with SnackBarHandler {
  // ...
}

Código Proposto

class GuardiansPage extends StatefulWidget {
  const GuardiansPage({
    Key? key,
    this.title = 'Guardians',
    required this.controller,
  }) : super(key: key);

  final String title;
  final GuardiansController controller;

  @override
  _GuardiansPageState createState() => _GuardiansPageState();
}

class _GuardiansPageState extends State<GuardiansPage> with SnackBarHandler {
  late final GuardiansController controller;
  List<ReactionDisposer>? _disposers;
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
  final GlobalKey<RefreshIndicatorState> _refreshIndicatorKey =
      GlobalKey<RefreshIndicatorState>();

  PageProgressState _loadState = PageProgressState.initial;

  @override
  void initState() {
    super.initState();
    controller = widget.controller;
    WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
      controller.loadPage();
    });
  }

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _disposers ??= [
      _showErrorMessage(),
      _showLoadProgress(),
      _showUpdateProgress(),
    ];
  }

  @override
  void dispose() {
    for (final d in _disposers!) {
      d();
    }
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        title: const Text('Meus Guardiões'),
        backgroundColor: DesignSystemColors.ligthPurple,
      ),
      body: PageProgressIndicator(
        progressState: _loadState,
        progressMessage: 'Carregando...',
        child: SafeArea(
          child: Observer(
            builder: (context) => _buildBody(controller.currentState),
          ),
        ),
      ),
    );
  }

  // ... (restante do código permanece igual)
}

Benefícios

  • Testabilidade: A injeção de dependência facilita a criação de testes unitários, pois o GuardiansController pode ser mockado.
  • Desacoplamento: Remove a dependência direta do Modular, tornando o código mais modular e fácil de manter.
  • Clareza: O código fica mais explícito sobre as dependências necessárias para a classe funcionar.

Tarefas

  • Substituir ModularState por State.
  • Adicionar GuardiansController como parâmetro no construtor.
  • Ajustar o ciclo de vida do State para inicializar e descartar corretamente o controller.
  • Atualizar os locais onde GuardiansPage é instanciada para passar o controller.

Observações

  • Certifique-se de que todas as instâncias de GuardiansPage sejam atualizadas para passar o controller como parâmetro.
  • Verifique se os testes existentes continuam passando após as alterações.
@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
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

1 participant