我正在读取 JSON 文件以根据数据生成布局。基本上,它返回一列或一行。我正在使用 FutureBuilder 来处理数据加载。
我还使用ValueNotifier来检测readyToInstall何时发生变化并触发 setState()。
您觉得这个方法怎么样?您认为这是处理这种情况的正确方法吗?
我注意到一件事:当我单击“更新”按钮时,print("ok"); 被调用两次。这是预期的行为吗?
代码运行良好,但我的目标是学习正确的实现方法。
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')),
],
);
}
}