我正在尝试初始化initstate中的一个变量。在初始化之前,null值在我的scaffold中使用。如何等待变量,然后再加载构建?我正在使用shared_preference插件。这是我的初始状态:
void initState() {
super.initState();
_createInterstitialAd();
Future.delayed(Duration.zero, () async {
prefs = await SharedPreferences.getInstance();
future = Provider.of<Titles>(context, listen: false).fetchAndSetPlaces();
identifier = await getimages();
});
在这里,我正在检查它是否为空并且始终为空:
@override
Widget build(BuildContext context) {
print(prefs);
为什么要在init状态下初始化变量。在上下文中使用Future Builder,首先获取变量数据,然后执行构建。
class FutureDemoPage extends StatelessWidget {
Future<String> getData() {
return Future.delayed(Duration(seconds: 2), () {
return "I am data";
// throw Exception("Custom Error");
});
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
appBar: AppBar(
title: Text('Future Demo Page'),
),
body: FutureBuilder(
builder: (ctx, snapshot) {
// Checking if future is resolved or not
if (snapshot.connectionState == ConnectionState.done) {
// If we got an error
if (snapshot.hasError) {
return Center(
child: Text(
'${snapshot.error} occured',
style: TextStyle(fontSize: 18),
),
);
// if we got our data
} else if (snapshot.hasData) {
// Extracting data from snapshot object
final data = snapshot.data as String;
return Center(
child: Text(
'$data',
style: TextStyle(fontSize: 18),
),
);
}
}
// Displaying LoadingSpinner to indicate waiting state
return Center(
child: CircularProgressIndicator(),
);
},
// Future that needs to be resolved
// inorder to display something on the Canvas
future: getData(),
),
),
);
}}
如果您稍后想要initialize
一个变量,那么我们有用于此目的的late
关键字。当declaring
是一个变量时,您可以使用如下所示的方法:
late String prefs;
首先,您必须了解颤振的生命周期。我为你简化了。。
- createState((
- initState((
- didChangeDependencies((
- build((
- didUpdateWidget((
- setState((
- 处置((
所以每个覆盖函数都有固定的功能。例如,initState只能用于正常初始化。它无法保持/等待流动好几次。因此,任何异步方法都不适用于initState内部。
对于解决方案,您必须使用FutureBuilder等待数据或在导航到下一页之前初始化首选项,然后继续。
我假设您有3个不同的条件:用于偏好的第一等待数据,从这些偏好中获取未来的数据,并渲染结果。
试试这个:集团模式
它基本上是应用程序ui 的流到不同状态和逻辑部分