我有一个 JSON 格式的列表列表,如下所示。我需要将这些列表转换为 Flutter 中的 DropDownMenu 项。要做到这一点,
\n在打印第一项的最后items,我得到了Instance of 'FormContent'执行的结果(我在下面的 FutureBuilder 小部件中标记了它)。"stajTuru"我期待的是JSON 文件中的列表。
\n\n\n
["Ortopedi", "Kardiyoloji","Dermatoloji", "Pediatri"]
由于存在嵌套列表格式。我尝试执行print(items[0][0].toString());以获取第一项的内容。但是,我收到这样的错误
Class 'FormContent' has no instance method '[]'.Receiver: Instance of 'FormContent' Tried calling: [](0)\nRun Code Online (Sandbox Code Playgroud)\n总而言之,我需要将这些 JSON 内容转换为单独的List<String>. 就像我上面所期待的那样。
[\n\n\n {\n "stajTuru": [ "Ortopedi", "Kardiyoloji","Dermatoloji", "Pediatri"],\n "cinsiyet": ["Erkek","Kad\xc4\xb1n", "Di\xc4\x9fer"],\n "etkilesimTuru": [ "G\xc3\xb6zlem", "Yard\xc4\xb1mla yapma","Yard\xc4\xb1ms\xc4\xb1z yapma","Sanal olgu"],\n "kapsam": [ "\xc3\x96yk\xc3\xbc", "Fizik Bak\xc4\xb1", "Tan\xc4\xb1sal ak\xc4\xb1l Y\xc3\xbcr\xc3\xbctme", "Terop\xc3\xb6tik ak\xc4\xb1l y\xc3\xbcr\xc3\xbctme"],\n "ortam": ["Poliklinik","Servis","Acil","Ameliyathane","D\xc4\xb1\xc5\x9f Kurum"],\n "doktor": [ "Esra Demir","Mehmet U\xc3\xa7ar","Kemal Yurdakul","Fehmi \xc3\x96zt\xc3\xbcrk","Mehmet \xc3\x96z"]\n }\n\n]\n\nRun Code Online (Sandbox Code Playgroud)\n这是我的班级,我保存每个列表
\nclass FormContent{\n\n late List<dynamic> _cinsiyetItems;\n late List<dynamic> _stajTuruItems;\n late List<dynamic> _etkilesimTuruItems;\n late List<dynamic> _kapsamItems;\n late List<dynamic> _ortamItems;\n late List<dynamic> _doktorItems;\n\n FormContent.fromJson(Map<String,dynamic> jsonFile){\n _cinsiyetItems=jsonFile['cinsiyet']!.toList();\n _stajTuruItems=jsonFile['stajTuru']!.toList();\n _etkilesimTuruItems=jsonFile['etkilesimTuru']!.toList();\n _kapsamItems=jsonFile['kapsam']!.toList();\n _ortamItems=jsonFile['ortam']!.toList();\n _doktorItems=jsonFile['doktor']!.toList();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n这是我将 JSON 数据转换为列表的方法
\n Future<List<dynamic>> readJsonData() async{\n final jsonData = await rootBundle.rootBundle.loadString('assets/json/formdata.json');\n print(jsonData.toString());\n final list = json.decode(jsonData) as List<dynamic>;\n print("======================================");\n print(list.toString());\n var result =list.map((e) => FormContent.fromJson(e)).toList();\n print("------------------------------------------");\n print(result.toString());\n return result;\n }\nRun Code Online (Sandbox Code Playgroud)\n最后,这是我的 FutureBuilder 来执行数据
\nFutureBuilder(\n future:readJsonData() ,\n builder: (context,snapshot){\n if(snapshot.hasError){\n return Text(snapshot.error.toString());\n }else if(snapshot.hasData){\n\n var items =snapshot.data as List<dynamic>;\n print("--------------***********************************");\n print(items[0].toString()); // <--- HERE\n return\n ListView(\n children: [\n myTextFieldRow("Kay\xc4\xb1t No: ", 10,_formData.setKayitNo),\n myDropDownContainer(_valueStajTuru,_stajTuruItems,\n hintTextStajTuru, onChangedStajTuru),\n // myDropDownContainer(_valueDoktor, _doktorItems, hintTextDoktor, onChangedDoktor),\n myTextFieldRow("Hastan\xc4\xb1n Ya\xc5\x9f\xc4\xb1:", 3, _formData.setYas),\n // myDropDownContainer(_valueCinsiyet, _cinsiyetItems, hintTextCinsiyet, onChangedCinsiyet),\n myTextFieldRow("\xc5\x9eikayet:", 10,_formData.setSikayet),\n myTextFieldRow("Ay\xc4\xb1r\xc4\xb1c\xc4\xb1 Tan\xc4\xb1:", 50,_formData.setAyiriciTani),\n myTextFieldRow("Kesin Tan\xc4\xb1:", 50,_formData.setKesinTani),\n myTextFieldRow("Tedavi Y\xc3\xb6ntemi:", 100,_formData.setTedaviYontemi),\n // myDropDownContainer(_valueEtkilesim, _etkilesimTuruItems, hintTextEtkilesim, onChangedEtkilesim),\n // myDropDownContainer(_valueKapsam, _kapsamItems, hintTextKapsam, onChangedKapsam),\n // myDropDownContainer(_valueOrtam, _ortamItems, hintTextOrtam, onChangedOrtam),\n const SizedBox(\n height: 20,\n ),\n Row(\n mainAxisAlignment: MainAxisAlignment.end,\n children: [\n SizedBox(\n width: 150,\n height: 50,\n child: TextButton(\n onPressed: () {\n setState(() {\n _formAdd.addNewFormToList(_formData);\n _formData=FormData();\n\n Navigator.push(context, MaterialPageRoute(builder: (context)=> StudentProfile(formAdd: _formAdd)));\n });\n },\n child: Text(\n "G\xc3\x96NDER",\n style: kTextStyle.copyWith(fontSize: 20),\n ),\n style: ButtonStyle(\n backgroundColor: MaterialStateProperty.all<Color>(\n const Color(0xff4F4DBB),\n ),\n ),\n ),\n ),\n ],\n ),\n ],\n );\n } else{\n return const Center(child:CircularProgressIndicator(),);\n }\n }\n )),\n\nRun Code Online (Sandbox Code Playgroud)\n
首先,你的FormContent课程需要以某种方式重新设计。类中的所有内容当前都是私有的,这不让您有任何方式获取类中包含的数据。此外,您还可以通过提供列表类型List<String>而不是 来更具体List<dynamic>,并且也不需要创建属性late。这是我建议的课程重写:
class FormContent {
List<String> cinsiyetItems;
List<String> stajTuruItems;
List<String> etkilesimTuruItems;
List<String> kapsamItems;
List<String> ortamItems;
List<String> doktorItems;
FormContent.fromJson(Map<String, dynamic> jsonFile)
: cinsiyetItems = [...?jsonFile['cinsiyet']],
stajTuruItems = [...?jsonFile['stajTuru']],
etkilesimTuruItems = [...?jsonFile['etkilesimTuru']],
kapsamItems = [...?jsonFile['kapsam']],
ortamItems = [...?jsonFile['ortam']],
doktorItems = [...?jsonFile['doktor']];
}
Run Code Online (Sandbox Code Playgroud)
至于您的readJsonData函数,您应该通过将类型指定为而Future<List<FormContent>>不是 来更加具体Future<List<dynamic>>。我会重写如下:
Future<List<FormContent>> readJsonData() async {
final jsonData = await rootBundle.rootBundle.loadString('assets/json/formdata.json');
return [
for (final e in json.decode(jsonData)) FormContent.fromJson(e),
];
}
Run Code Online (Sandbox Code Playgroud)
对于这个问题:
在打印第一项的最后,我得到了“FormContent”的实例作为执行的结果(我在下面的 FutureBuilder 小部件中标记了它)。我期待的是 JSON 文件中的“stajTuru”列表。
您只需打印出您从中获得的第一个元素,readJsonData该元素是您的类的实例FormContent。您可以print(items[0].stajTuruItems);查看stajTuru打印出来的列表。
| 归档时间: |
|
| 查看次数: |
1702 次 |
| 最近记录: |