无需使用FutureBuilder即可检索数据

时间:2019-01-22 15:05:36

标签: dart flutter

我想不使用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中,而不是存储在小部件的参数中。

2 个答案:

答案 0 :(得分:0)

您遇到的问题是由于您可能没有为应用程序设置体系结构而导致的,因此您的状态,业务逻辑和ui代码都被混合在一个地方。

您想要做的是能够独立于将数据绑定到FutureBuilder来请求数据(我最近做过同样的事情)。首先,您需要将所有操作逻辑与UI分开,因此您需要某种架构。它们很多,但我发现最有用的两个是:

  1. 作用域模型。有关体面的模型教程,请查看this

  2. Redux(在当前情况下过度杀伤)

例如,这是我的notices_model文件中的一个函数。

Future fetchNotices() async {
 if (_notices == null || _notices.length == 0) {
  _notices = await _mobileApi.getNotices();
  notifyListeners();
 }
}

您看到的_notices是我通过属性公开的类型为List的局部变量。简而言之。

  1. 设置一种架构,将您的视图逻辑与您的操作/业务逻辑分开

  2. 绑定到视图逻辑中的属性,然后正常执行操作即可。

还请查看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
        }
    }),
);