未处理的异常:NoSuchMethodError:类“int”没有实例方法“[]”

时间:2021-04-18 15:33:42

标签: flutter firebase-realtime-database

我的调试语句正确地显示了数据库,在出现问题之后并出现错误: 未处理的异常: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

请提供任何帮助,我们将不胜感激。

2 个答案:

答案 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((){});
  }
}