在颤振中加载屏幕的 HTTP 调用



我们有一个功能类,我们试图在屏幕加载时填充它。它是一个返回对象的 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... }

最新更新