Future返回正确的数据,但快照显示为null



所以我正在尝试实现搜索功能,正如你所看到的,我正在使用FutureBuilder来实现它。当API调用时,它会返回预期的结果,但当我尝试在Future生成器中使用它时,数据总是空的:

@override
Widget buildResults(BuildContext context) {
return FutureBuilder<List<SearchModel>>(
future: getResults(),
builder: ( BuildContext context, AsyncSnapshot<List<SearchModel>> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
logger.d(snapshot.hasData);
return ListView.builder(
itemBuilder: (context, index) {
return ListTile(
title: Text(snapshot.data[index].title),
onTap: () {
close(context, snapshot.data[index]);
},
);
},
itemCount: snapshot.data.length,
);
} else {
return Center(
child: CircularProgressIndicator(),
);
}
},
);
}
Future<List<SearchModel>> getResults() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String language = prefs.getString('language');
var data;
List<SearchModel> results = [];
data  = await http.get(Constants.BASE_URL + "/search/" + language + "/" + query,);
results = (data.map((model) => SearchModel.fromJson(model)).toList());
return results;
}

我不知道你的API,它是JSON响应,所以这是你的代码应该是什么样子的最佳猜测:

Future<List<SearchModel>> getResults() async {
final prefs = await SharedPreferences.getInstance();
final language = prefs.getString('language');
final response = await http.get(Constants.BASE_URL + "/search/" + language + "/" + query);
final results = ((response.body as List).map((model) => SearchModel.fromJson(model)).toList());
return results;
}

也就是说,你需要检查FutureBuilder是否为snapshot.hasError,你需要查看response.statusCode == 200的响应(或任何适合该呼叫的响应(,因为外部呼叫可能会出现很多问题,你需要你的应用程序在这种情况下不会崩溃。

当Future尚未解析snapshot.data为null时,请检查snapshot.connectionState==connectionState.done或snapshot.ddata!=null,并返回else中的Loading小部件(带有Loading小程序/进度指示器或类似指示器(和if.中的功能小部件

最新更新