在颤振中构建之前初始化变量?
initializing variables before build in flutter?
我正在尝试在 initstate 中初始化一个变量。在我的脚手架中使用初始化空值之前。我如何等待变量然后加载构建?我正在使用 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);
如果您以后想 initialize
一个变量,那么我们有 late
关键字用于此目的。当 declaring
变量时,您可以像下面这样使用它:
late String prefs;
为什么要在初始状态初始化变量。
在您的上下文中使用 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(),
),
),
);
}
}
首先你要了解flutter的生命周期。
我为你做的很简单..
- 创建状态()
- initState()
- didChangeDependencies()
- 构建()
- didUpdateWidget()
- setState()
- 处置()
所以每个覆盖函数都有固定的功能。例如 initState 只能用于正常初始化。不能hold/await流几次。这就是为什么任何异步方法在 initState 中都不适用的原因。
对于解决方案,您必须使用 FutureBuilder 等待数据,或者在导航到下一页之前初始化首选项然后继续。
我假设您有 3 种不同的情况:
首先等待首选项的数据,
从该首选项中获取未来数据,
并渲染结果。
试试这个:bloc pattern
它基本上是应用程序不同状态和逻辑部分的流 ui
我正在尝试在 initstate 中初始化一个变量。在我的脚手架中使用初始化空值之前。我如何等待变量然后加载构建?我正在使用 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);
如果您以后想 initialize
一个变量,那么我们有 late
关键字用于此目的。当 declaring
变量时,您可以像下面这样使用它:
late String prefs;
为什么要在初始状态初始化变量。 在您的上下文中使用 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(),
),
),
);
} }
首先你要了解flutter的生命周期。 我为你做的很简单..
- 创建状态()
- initState()
- didChangeDependencies()
- 构建()
- didUpdateWidget()
- setState()
- 处置()
所以每个覆盖函数都有固定的功能。例如 initState 只能用于正常初始化。不能hold/await流几次。这就是为什么任何异步方法在 initState 中都不适用的原因。
对于解决方案,您必须使用 FutureBuilder 等待数据,或者在导航到下一页之前初始化首选项然后继续。
我假设您有 3 种不同的情况: 首先等待首选项的数据, 从该首选项中获取未来数据, 并渲染结果。
试试这个:bloc pattern
它基本上是应用程序不同状态和逻辑部分的流 ui