我正在开发一个应用程序,该程序需要我从服务器(在我的情况下是一个简单的Firebase实时数据库)中获取数据并在调用build方法之前将获取的数据存储在map中,因为我将需要使用map在构建方法中。
在这里,我尝试使用测试代码来重新创建错误。
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';
class Test extends StatefulWidget {
@override
Map<String, dynamic> livefeed;
State<StatefulWidget> createState() {
// TODO: implement createState
return TestState();
}
}
class TestState extends State<Test> {
@override
void initState() {
http
.get('HERE GOES THE URL FOR THE DATABASE ,CANT DISCLOSE')
.then((http.Response response) {
widget.livefeed = json.decode(response.body);
print(widget.livefeed);
print(widget.livefeed.length);
});
// TODO: implement initState
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
child: Text(widget.livefeed.toString()),
);
}
}
控制台打印:
{-Lh7FJV_7FIXgEUUS3Is: {skill: Andriod dev, target: Just Entered The Lab.,
username: test}, -Lh7RKgw3K2ZuKjrBZd2: {skill: Andriod dev, target: Just
Entered The Lab., username: test}}
I/flutter ( 7078): 2
但是,当我尝试在屏幕上显示地图时,我的UI却显示为空 内部的构建方法。
我知道在Build()方法尚未初始化失败之前调用了initState()方法,调试控制台确认已获取数据,但仍无法在屏幕上打印,这意味着在值被调用之前正在调用构建初始化。
答案 0 :(得分:0)
您需要将其放入setState方法中
widget.livefeed = json.decode(response.body);
当然,您需要处理widget.livefeed
为空时显示的内容。正如您所说的,即使initState()方法在Build()方法之前被调用,http.get()
也是一个异步函数。您不能确保它会在调用build方法之前完成,因为它是一种异步功能。
您可以这样处理
Text(widget.livefeed!=null?widget.livefeed.toString():'some default text like loading...'),