我们有一个功能类,我们试图在屏幕加载时填充它。它是一个返回对象的 http 调用。我正在为如何做到这一点而苦苦挣扎。我们所有的 http 调用都是通过单击按钮完成的:
这是电话
Future<Features> getFeatureStatus(String userID) async {
Features _features;
final response =
await http.post('http://url/api/Features',
headers: {"Content-Type": "application/json",
'Accept': 'application/json',},
body: json.encode({'userID' : userID }));
_features = Features.fromJson(json.decode(response.body));
return _features;
}
当我尝试在类的顶部调用它时,我收到错误并且无法获取值。
class FlutterReduxApp extends StatelessWidget {
static final User user;
static final Features features = getFeatureStatus(user.userId);
我得到的错误是 - "无法将'未来'类型的值分配给'特征'类型的变量。 尝试更改变量的类型,或将右侧类型转换为"Features".dart(invalid_assignment(">
我确定我在这里做了一些不正确的事情,但我还没有做过屏幕加载调用。
当您尝试在无状态小部件中将其读取为类型Features
时,getFeatureStatus
函数会返回一个Future<Features>
。
有不同的方法可以读取值,但由于您有一个按钮,您可以将小部件转换为StatefulWidget
然后使用onPressed
函数读取值并在之后更新状态,例如。
onPressed: () async {
features = await getFeatureStatus(user.userId);
setState((){
// do something
});
}
在这种情况下,值features
不能是静态 final,因此您必须将其更改为Features features
。
根据评论进行编辑:
您也可以在 initState 中执行此操作:
Features features;
@override
void initState () {
super.initState();
_asyncMethod();
}
_asyncMethod() async {
features = await getFeatureStatus(user.userId);
setState((){});
}
所以在小部件构建方法中,你可以做:
return (features == null)
? CircularProgressIndicator()
: MyWidget(...); // where features is used.
getFeatureStatus(user.userId).than((features)
{
// you will get the features object
//you can work on that object
}
);
使用 statefull 时,在 initState(( 中调用 getFeaturesStatus 方法。
首先,当您尝试将类型"Features"分配给类型"Future"时,此行static final Features features = getFeatureStatus(user.userId);
不起作用。
解决方案是await
未来,以便它解析并返回满足名为"features"的变量的 Feature 数据类型。
这如下:static final Features features = await getFeatureStatus(user.userId);
但这必须在一个单独的函数中,该函数使用 async 参数显式定义。
这解决了您编写的代码方面的错误,但正如您所说,您希望在屏幕加载后加载它(或者从技术上讲,当主小部件"挂载"时(。
这个逻辑方面的解决方案可以是使用this.mounted
.
所有小部件都有一个 bool this.mount 属性。当分配 buildContext 时,它变为 true。
简而言之,假设您想在任何小部件挂载/加载后运行一个函数,您可以通过以下方式进行测试
if(this.mounted){
//Whatever you want to do when the widget has been mounted...
}