我想不使用FutureBuilder方法来获取数据
这是我的方法:
Future<bool> fetchJointures(http.Client client) async {
final response = ('{"isInteresses": false}');
return compute(parseJointures, response.body);
}
bool parseJointures(String responseBody) {
final jsonParsed = json.decode(responseBody);
return jsonParsed['isInteresses'];
}
以及该示例如何执行:https://flutter.io/docs/cookbook/networking/background-parsing以显示数据:
FutureBuilder<bool>(
future: fetchJointures(http.Client()),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return A_Widget(data : snapshot.data);
},
);
我想像这样在var中检索并存储我的数据:
布尔数据= snapshot.data;
最后,我搜索如何检索数据并将其存储在var中,而不是存储在小部件的参数中。
答案 0 :(得分:0)
您遇到的问题是由于您可能没有为应用程序设置体系结构而导致的,因此您的状态,业务逻辑和ui代码都被混合在一个地方。
您想要做的是能够独立于将数据绑定到FutureBuilder来请求数据(我最近做过同样的事情)。首先,您需要将所有操作逻辑与UI分开,因此您需要某种架构。它们很多,但我发现最有用的两个是:
作用域模型。有关体面的模型教程,请查看this
Redux(在当前情况下过度杀伤)
例如,这是我的notices_model文件中的一个函数。
Future fetchNotices() async {
if (_notices == null || _notices.length == 0) {
_notices = await _mobileApi.getNotices();
notifyListeners();
}
}
您看到的_notices是我通过属性公开的类型为List的局部变量。简而言之。
设置一种架构,将您的视图逻辑与您的操作/业务逻辑分开
绑定到视图逻辑中的属性,然后正常执行操作即可。
还请查看FlutterSamples的github上的体系结构和示例
答案 1 :(得分:0)
即使使用FutureBuilder,也可以正常存储数据。您也不需要指定要返回的var类型。试试这个:
var data;
var initialFutureData;
new FutureBuilder(
future: fetchJointures(http.Client()), // a Future<String> or null
initialData: initialFutureData,
builder: (BuildContext context, AsyncSnapshot snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.none:
return Center(child: new Text('No connection...')); // error output
case ConnectionState.waiting:
return Center(
child: Padding(
padding: const EdgeInsets.all(8.0),
child: new CircularProgressIndicator(), // waiting indicator
));
default:
if (snapshot.hasError) return Center(child: new Text('Error: ${snapshot.error}'));
initialFutureData = snapshot.data; // store data in var for fast reloading
data = snapshot.data; // store data
return A_Widget(data: snapshot.data); // return final widget when successfull
}
}),
);