lleoserrano / asyncstate

Package for Flutter
BSD 3-Clause "New" or "Revised" License
8 stars 2 forks source link

Problema com GetMaterialApp.router e AsyncLoader no GetX #13

Open FoxHere opened 3 months ago

FoxHere commented 3 months ago

Olá, estou usando a navegação avançada do GetX na minha aplicação Flutter. Para isso, estou utilizando GetMaterialApp.router juntamente com GetRouteOutlet. No entanto, quando tento combinar isso com o AsyncLoader, encontro um erro.

Passos para Reproduzir

  1. Configure o GetMaterialApp.router no seu aplicativo.
  2. Utilize o GetRouteOutlet para gerenciar a navegação.
  3. Adicione o AsyncLoader no GetMaterialApp.router.
  4. Chame em um botão o await Future.delayed(const Duration(seconds: 2)).asyncLoader().

Código de exemplo


@override
  Widget build(BuildContext context) {
    return AsyncStateBuilder(
      builder: (navigatorObserver) {
        return GetMaterialApp.router(
          debugShowCheckedModeBanner: false,
          title: title,
          initialBinding: initialBinding,
          getPages: [...pages ?? []],
          navigatorObservers: [
            navigatorObserver,
            ...navigatorObservers ?? [],
          ],
        );
      },
    );
  }

// Um botão em um stl widget qualquer
@override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          ElevatedButton(
            onPressed: () async {
              await Future.delayed(const Duration(seconds: 2)).asyncLoader();
            },
            child: const Text('AsyncLoad'),
          ),
        ],
      ),
    );
  }

Mensagem de Erro

Error
dart-sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart 296:3  throw_
packages/asyncstate/asyncstate.dart 115:7                                    hide
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 84:54           runBody
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 127:5           _async
packages/asyncstate/asyncstate.dart 105:27                                   hide
packages/asyncstate/asyncstate.dart 33:25                                    AsyncLoaderExtension$124asyncLoader
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 60:31           <fn>
dart-sdk/lib/async/zone.dart 1666:54                                         runBinary
dart-sdk/lib/async/future_impl.dart 178:22                                   handleError
dart-sdk/lib/async/future_impl.dart 859:46                                   handleError
dart-sdk/lib/async/future_impl.dart 880:13                                   _propagateToListeners
dart-sdk/lib/async/future_impl.dart 660:5                                    [_completeError]
dart-sdk/lib/async/future_impl.dart 746:7                                    callback
dart-sdk/lib/async/schedule_microtask.dart 40:11                             _microtaskLoop
dart-sdk/lib/async/schedule_microtask.dart 49:5                              _startMicrotaskLoop
dart-sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart 181:7           <fn>

Ambiente de desenvolvimento

Poderiam me ajudar a entender por que estou recebendo este erro ao combinar GetMaterialApp.router, GetRouteOutlet e AsyncLoader? Existe alguma configuração específica ou prática recomendada para usar esses componentes juntos?

lleoserrano commented 3 months ago

Olá @FoxHere , estive analisando o código que forneceu e também o Getx.

Quando utilizamos a extensão ".router" seja do Material ou do [GetMaterialApp], não é possivel fornecer os "observers" para o navigator.

Se analisar o código interno do [GetMaterialApp.router] na linha 184, verá que caso não forneça o [routerDelegate] o GetX atribui um.

Screenshot 2024-08-15 at 19 30 32

A atribuição proposital deste elemento, faz com que na linha 245, na verificação do [routerDelegate] seja utilizado o [MaterialApp.router] invés de [MaterialApp], assim não recebendo os observers passados no construtor.

Screenshot 2024-08-15 at 19 34 05

Portanto para utilização de outlet, o asyncstate teria de utilizar uma outra abordagem onde não depende da observação do navigator, vou estudar este usecase.