我的调试语句正确地显示了数据库,在出现问题之后并出现错误: 未处理的异常:NoSuchMethodError:类“int”没有实例方法“[]”。 当我尝试在我的应用程序中显示时,我得到了空数据,这是因为我用来存储值的列表长度为 0。
这是我的课:
class Values {
num humidity;
num temperature;
num moisture;
bool led;
Values({this.humidity,this.temperature,this.moisture,this.led});
}
class RealtimeDB extends StatefulWidget {
@override
_RealtimeDBState createState() => _RealtimeDBState();
}
class _RealtimeDBState extends State<RealtimeDB> {
final databaseReference = FirebaseDatabase.instance.reference().child("Values");
final AuthService _auth = AuthService();
List<Values> list = new List();
@override
void initState() {
super.initState();
databaseReference.once().then((DataSnapshot snap) {
print("Data: ${snap.value}"); //Debug statement
var data=snap.value;
list.clear();
data.forEach((key,value){
Values val=new Values(
humidity: value["Humidity"],
moisture: value["Moisture"],
temperature: value["Temperature"],
led: value["MotorControl"],
);
list.add(val);
});
setState((){});
});
}
这是我的列表视图构建器:
body: new Container(
child: list.length==0?Text("Data is null"): new ListView.builder(
itemCount: list.length,
itemBuilder: (_,index){
return UI(list[index].humidity, list[index].temperature, list[index].moisture, list[index].led);
}
),
)
);
}
}
这是我的简单数据库 enter image description here
这是控制台: enter image description here
请提供任何帮助,我们将不胜感激。
答案 0 :(得分:0)
您的数据如下所示 -
{Temperature: 15, Moisture: 14, Humidity: 12, MotorControl: false }
data.forEach((key, value) => WHATEVER)
,这里你的价值是:
15, 14, 12, 假..
这些不是列表,您以 value["WHATEVER"]
的身份访问它们。这就是为什么。你正在得到。 “类‘int’没有实例方法‘[]’”
你能做什么 -
list.add(
Values(
humidity: int.parse(value["Humidity"]),
moisture: int.parse(value["Moisture"]),
temperature: int.parse(value["Temperature"]),
led: value["MotorControl"],
),
);
答案 1 :(得分:0)
您似乎在尝试获取值时遇到错误
humidity: value["Humidity"],
这是因为 snaps.value 是一个 Json 或更确切地说是 Map 对象,您可以从 Map 创建一个实用程序并将其添加到您的 Values 类中,而且由于它是一个 Map,您不需要循环遍历它。
Values.fromMap(Map<String, dynamic> map):
humidity: int.parse(value["Humidity"].toString()),
moisture: int.parse(value["Moisture"].toString()),
temperature: int.parse(value["Temperature"].toString()),
led: value["MotorControl"],
然后你可以像这样使用它
@override
void initState() {
super.initState();
databaseReference.once().then((DataSnapshot snap) {
print("Data: ${snap.value}"); //Debug statement
Map data=snap.value;
final value = Value.fromMap(data);
list.add(value);
setState((){});
}
}