我正试图从此链接中获取数据:
Future<String> fetchQuestion() async {
var response =
await http.get(Uri.encodeFull("https://opentdb.com/api.php?amount=10&category=12&difficulty=easy&type=boolean"),headers:{"Accept":"application/json"} );
setState(() {
var responseBody=json.decode(response.body);
data=responseBody["results"];
});
print(data);
return "Sucess";
}
我写了这个来设置初始状态以调用该函数:
@override
void initState(){
super.initState();
this.fetchQuestion();
}
这是脚手架:
return Scaffold(
appBar: AppBar(title: Text('Quiz')),
body: Column(
children: <Widget>
[Container(
height: 200.0,
child:Text(data[i]["question"]),
),
Container(
child:RaisedButton(
child: Text(b1):Text(' '),
onPressed: (){
checkT();
next();
}
),
),
Container(
child:RaisedButton(
child: Text(b2),
onPressed:(){
checkw() ;
next();
}
),
),
当我尝试出现此错误时: 方法'[]'在null上被调用,然后它刷新自身,应用运行,我不知道为什么。任何想法? 预先感谢。
答案 0 :(得分:1)
因为File directory = getContext().getFilesDir();
File file = new File(directory, filename);
mLayout.addView(createNewTextView(*file*));
是data
,直到网络通话结束。提取数据(null
之后,fetchQuestion
(在fetchQuestion内部)将使用从网络获取的非空数据刷新视图。
您的用例可能需要一个FutureBuilder。
答案 1 :(得分:0)
data
将持续null
几毫秒,直到http请求往返服务器,返回并运行setState
中的代码,该代码设置data
解码后的响应。在这段时间内,由于数据尚未初始化,因此flutter将尝试绘制屏幕并且无法构建Text(data[i]...
。
解决方法是检测data
为空并构建不同的东西,直到它被设置为止:
body: (data == null) ? const CircularProgressIndicator() : Column(
...
大概您将i
设置为问题列表中有效索引的某个位置。