Getx: Não é possível usar mais de um GetBuilder na mesma tela

Created on 3 Jun 2020  ·  4Comments  ·  Source: jonataslaw/getx

Não se estou fazendo da forma correta, porém aqui está o código.

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_api/app/modules/home/home_controller.dart';

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: GetBuilder<HomeController>(
          builder: (HomeController homeController) => Text('${homeController.postList.length.toString()}',),
        ),
      ),
      body: GetBuilder<HomeController>(
        init: HomeController(),
        initState: (_) => HomeController.to.getPosts(),
        builder: (HomeController homeController) => homeController.postList.length == 0 ?
        Center(
          child: CircularProgressIndicator(),
        ) : 
        ListView.builder(
          itemCount: homeController.postList.length,
          itemBuilder: (_, index) => ListTile(
            title: Text('${homeController.postList[index].title}'),
            subtitle: Text('${homeController.postList[index].body}'),
          ),
        ),
      ),
    );
  }
}

Output:
(23933): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (23933): The following NoSuchMethodError was thrown building _BodyBuilder:
I/flutter (23933): The getter '_allStates' was called on null.
I/flutter (23933): Receiver: null
I/flutter (23933): Tried calling: _allStates
I/flutter (23933):
I/flutter (23933): The relevant error-causing widget was:
I/flutter (23933): Scaffold

Most helpful comment

Agora funcionou!! Muito Obrigado pela a ajuda, disposição e esclarecimento sobre a renderização dos widgets!

All 4 comments

Editei sua resposta como deveria funcionar.
Basicamente, você precisa tipar o GetBuilder pra ele fazer a busca daquele controlador na memória.
Usando Bindings e Obx não é necessário tipar nada, preciso fazer um vídeo urgentemente sobre essa última atualização.
E só uma dica:

initState: (_) => HomeController.to.getPosts(),

Isso é desnecessário.
tu pode remover essa linha e simplesmente fazer isso no seu Controller:

HomeController extends GetController{
onInit() => getPosts();

da mesma forma, se tu quer fechar alguma coisa no dispose, tu não precisa do dispose do GetBuilder, tu pode fazer simplesmente isso:

onClose() => print("controller fechado");

Continua com o mesmo erro

Output:
══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter (11133): The following NoSuchMethodError was thrown building _BodyBuilder: I/flutter (11133): The getter '_allStates' was called on null. I/flutter (11133): Receiver: null I/flutter (11133): Tried calling: _allStates I/flutter (11133): I/flutter (11133): The relevant error-causing widget was: I/flutter (11133): Scaffold I/flutter (11133): lib\…\home\home_page.dart:8 I/flutter (11133): I/flutter (11133): When the exception was thrown, this was the stack: I/flutter (11133): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5) I/flutter (11133): #1 _GetBuilderState.initState

Foi mal, não tinha visto que tu tinha um GetBuilder na tua appBar, tirei o init dela e coloquei no body ae no teu comentário, certamente vai funcionar.
Então, uma coisa inusitada, no Flutter, a appbar é renderizado depois do body, então tu deve colocar o init sempre no primeiro widget do body, igual minha última alteração no teu código.
Flutter renderiza o body, depois a appbar, depois a bottomBar e por último o FloatingActionButton.

Agora funcionou!! Muito Obrigado pela a ajuda, disposição e esclarecimento sobre a renderização dos widgets!

Was this page helpful?
0 / 5 - 0 ratings