flutter - 无法在构建之前初始化变量?
问题描述
我正在开发应用程序,该应用程序需要我从服务器获取数据(在我的情况下是一个简单的 firebase 实时数据库),并在调用 build 方法之前将获取的数据存储在 map 中,因为我需要在 build 中使用 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 显示为 null。
我知道在 Build() 方法但初始化失败之前调用了 initState() 方法,调试控制台确认正在获取数据但它未能在屏幕上打印,这意味着在初始化值之前调用了构建。
解决方案
你需要把它放在一个 setState 方法中
widget.livefeed = json.decode(response.body);
当然,您需要处理widget.livefeed
null 时要显示的内容。正如您所说,即使在 Build() 方法之前调用了 initState() 方法,http.get()
也是一个异步函数。您不能保证它会在调用 build 方法之前完成,因为它是一个异步函数。
你可以这样处理
Text(widget.livefeed!=null?widget.livefeed.toString():'some default text like loading...'),
推荐阅读
- java - 最大值和最小值的递归范围输出
- c# - Blazor 滑块范围输入与按钮 - 在移动 Android 浏览器与浏览器上有所不同
- javascript - 如何使用 onchange 函数动态禁用工具提示下拉列表中的元素
- pytorch - 拥抱脸变压器 gpt2 生成多个 GPU
- python - Python MongoDB聚合按_id删除文档
- python-3.x - 基于项目的学习
- windows-10 - 如何根据特定文件类型修改 Win10 注册表以在上下文菜单中提供程序调用?
- python - Python按模板对数组进行排序
- vue.js - Vue 2:第二次 URL 没有正确刷新
- c# - 将多色字符串打印到richtextbox