NoSuchMethodError 抖动

NoSuchMethodError Flutter

请帮帮我... 几天以来我一直试图解决这个问题,但没有任何效果 T.T

我不明白什么是 null 或 [] ... 我收到的 json 没问题

我获取数据的函数

  Future<dynamic> getTypeTemps() async {
    var res = await http.post(Uri.parse(TTurl + "?action=LST"));
    if (res.statusCode == 200) {
      setState(() {
        TTdata = json.decode(res.body);
      });
    } else {
      setState(() {error = true; message = "Erreur avec la table TypeTemps";});
    }   }

在 void initstate() 中调用了 getTypeTemps

显示列表的小部件

Widget WdgListTT() {
    List<TypesTemps> ttlist = List<TypesTemps>.from(
        TTdata["TTdata"].map((i){
          return TypesTemps.fromJSON(i);
        })
    ); //searilize typetemps json data to object model.
    return Column(children: [
      const Padding(
        padding: EdgeInsets.only(bottom: 20),
      ),
      SizedBox(
        width: MediaQuery.of(context).size.width - 40,
        child: const Text("Type de temps", style: TextStyle(color: Colors.teal, fontWeight: FontWeight.bold, fontSize: 18),),
      ),
      SizedBox(
          width: MediaQuery.of(context).size.width - 50,
          child: DropdownButtonHideUnderline(
              child: DropdownButton<String>(
                //style: const TextStyle(color: Colors.white),
                value: valtypetemps,
                onChanged: (value) => setState(() => valtypetemps = value),
                elevation: 20,
                underline: Container(
                  height: 10,
                  color: Colors.red,
                ),
                hint: const Text("Sélectionnez un type",
                    style: TextStyle(fontSize: 16)),
                isExpanded: true,
                items: ttlist.map((typesTemps) {
                  return DropdownMenuItem(
                    child: Text(typesTemps.libelle,
                        style: TextStyle(color: Colors.black)),
                    value: typesTemps.libelle,
                  );
                }).toList(),
              )))
    ]);   }

class

class TypesTemps {   String code, libelle, type_temps;   TypesTemps({
    required this.code,
    required this.libelle,
    required this.type_temps,   });   factory TypesTemps.fromJSON(Map json) {
    return TypesTemps(
        code: json["CODE"],
        libelle: json["LIBELLE"],
        type_temps: json["SENS_TYPE_TEMPS"]);   } }

这是您的问题: 您有一张名为 TTdata 的地图。这张地图开始没有价值。 然后 initstate 运行,调用 getTypeTemps。 最后 build 运行。其中有这一行:

TTdata["TTdata"].map((i){

这一行是导致您的问题的原因,问题是“方法‘[]’被调用为空”。意思是你在一个null变量(一个没有值的变量)后面加了一个['something'](如果你想明白什么是null更好,I wrote an article on null safety,开头部分专门讲了null是什么意思).

很明显,getTypeTemps 没有正确地为 TTdata 赋值。从中读取时会导致错误。这是为什么?

原因很简单。 getTypeTemps 是一种异步方法,这意味着它会在 flutter 有空闲时间时执行,通常在 运行 首次构建之后。

这意味着您的代码按以下顺序执行:

initState -> build -> getTypeTemps.

因此,如果 TTdata 仍然为空,您应该采取某种安全措施。 这是您如何执行此操作的示例:

Widget build(BuildContext context) {
  if (TTdata == null) {
    return Text('loading...');
  }
   List<TypesTemps> ttlist = List<TypesTemps>.from(
        TTdata["TTdata"].map((i){
          return TypesTemps.fromJSON(i);
        })
    ); //searilize typetemps json data to object model.
    return Column(children: [
  ...
}

希望这个解释很清楚,可以帮助您解决问题。