【发布时间】:2021-10-13 21:33:41
【问题描述】:
我正在制作一个带有弹簧休息后端和颤振前端的平房预订系统。 在这个我想得到一个平房列表。 所以我决定创建一个方法来获取平房列表,该方法使用我为处理其余端点而创建的 HttpService 类,该方法是 getBungalows() 方法。 然后我通过重写 initstate() 来调用这个方法。 但问题是在我的 initstate() 完成之前。我的构建方法开始。 为了证明这一点,我打印了两行“打印”和“打印构建”,因为我认为我首先得到了“打印构建”。我在这里做错了什么。请帮忙。
从rest后端获取数据的方法
发生这种情况时,我首先检查了这个方法,但它工作正常并返回所需的结果。
Future<List<Bungalow>> getBungalows() async {
Uri uri = Uri.parse('$url/bungalows/');
http.Response response = await http.get(uri);
if (response.statusCode == 200) {
List<Bungalow> bungalows = List<Bungalow>.from(
json.decode(response.body).map((x) => Bungalow.fromJson(x)));
// print(bungalows.first.address + 'asafafasfafdfgfgarfgargafvfrvaerg');
return bungalows;
} else {
throw 'Unable to retrieve data';
}
}
主屏幕代码
class _HomeScreenState extends State<HomeScreen> {
HttpService httpService = HttpService();
late List<Bungalow> bungalows;
bool isLoggedIn = false;
User? user;
void getBungalows() async {
bungalows = await httpService.getBungalows();
print('done');
}
@override
Widget build(BuildContext context) {
if (widget.user != null) {
isLoggedIn = true;
user = widget.user;
}
print('done build');
return Scaffold(
backgroundColor: Colors.white,
body: Column(
children: [
Text(isLoggedIn ? user!.userDetail.username : 'No login'),
// TextButton(
// onPressed: () {
// setState(() {
// getBungalows();
// print(bungalows.first.address);
// });
// },
// child: Text('click'))
],
),
);
}
@override
void initState() {
getBungalows();
}
}
控制台输出
I/flutter (22248): done build
I/flutter (22248): done
【问题讨论】:
-
你没有在 initState 中等待所以你期望什么?
-
结果是我对现在代码的期望。
-
我已经在 getBungalow() 方法中完成了等待。
-
setState 拿到后带平房
-
@MarianoZorrilla 我必须做什么才能先完成打印然后完成构建。
标签: android flutter asynchronous mobile async-await