Estou lendo um arquivo JSON para gerar o layout com base nos dados. Basicamente, ele retorna uma coluna ou uma linha. Estou usando o FutureBuilder para manipular o carregamento de dados.
Também estou usando um ValueNotifier para detectar quando o readyToInstall muda e acionar setState().
O que você acha dessa abordagem? Você a consideraria uma maneira adequada de lidar com essa situação?
Uma coisa que notei: quando clico no botão "Update", print("ok"); é chamado duas vezes. Esse é o comportamento esperado?
O código funciona bem, mas meu objetivo é aprender a maneira correta de implementá-lo.
class InitInterface extends StatefulWidget {
const InitInterface({super.key});
@override
State<InitInterface> createState() => _InitInterfaceState();
}
class _InitInterfaceState extends State<InitInterface> {
//used in FutureBuilder to know when we are ready to start install the layout.
late Future<Widget> readyToInstall;
late Stream<Widget> readyToInstall0;
@override
void initState() {
//will read json file and get data to install the layout
readyToInstall = loadLayout();
readyToInstall.then((value){
print('teste');
panelData.addListener(() { //panelData is objhect from a class that extend ValueNotifier
readyToInstall = updateLayout();
setState(() {});
});
});
super.initState();
}
@override
Widget build(BuildContext context) {
return Column(
children: [
FutureBuilder<Widget>(
future: readyToInstall,
builder: (BuildContext context, AsyncSnapshot<Widget> snapshot) {
if (snapshot.hasData) {
print('ok'); //<--called two times after update
return snapshot.data!;
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return const Loading();
}
},
),
ElevatedButton(
onPressed:(){
readyToInstall = updateLayout();
setState(() {});
},
child: Text('Update')),
],
);
}
}