NoSuchMethodError 抖动
NoSuchMethodError Flutter
请帮帮我...
几天以来我一直试图解决这个问题,但没有任何效果 T.T
我有一个数据库phpmyadmin
我想显示 json 中由 php url 发送的列表。
我试着改编这段代码,https://www.fluttercampus.com/guide/53/how-to-make-drop-down-and-insert-options-by-php-mysql-in-flutter/
但是我有这个错误
在构建 AddTimePage(脏,依赖项:[MediaQuery],状态:AddTimeState#1a618)时引发了以下 NoSuchMethodError:方法“[]”在 null 上被调用。接收者:null 尝试调用:
我不明白什么是 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: [
...
}
希望这个解释很清楚,可以帮助您解决问题。
请帮帮我... 几天以来我一直试图解决这个问题,但没有任何效果 T.T
我有一个数据库phpmyadmin
我想显示 json 中由 php url 发送的列表。 我试着改编这段代码,https://www.fluttercampus.com/guide/53/how-to-make-drop-down-and-insert-options-by-php-mysql-in-flutter/ 但是我有这个错误
在构建 AddTimePage(脏,依赖项:[MediaQuery],状态:AddTimeState#1a618)时引发了以下 NoSuchMethodError:方法“[]”在 null 上被调用。接收者:null 尝试调用:
我不明白什么是 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: [
...
}
希望这个解释很清楚,可以帮助您解决问题。