我有一個 JSON 格式的串列,如下所示。我需要將這些串列轉換為 Flutter 中的 DropDownMenu 項。要做到這一點,
- 從 JSON 檔案中讀取資料
- 將資料轉換為可用的類格式(FormContent 類)
- 創建一個回傳 FormContent 串列的 Future。
- 讀取 FutureBuilder 里面的資料
- 將 FormContent 串列轉換為 DropDownMenu 可以接受的字串串列
在我列印 的第一項的最后items,我得到Instance of 'FormContent'了這次執行的結果(我在下面的 FutureBuilder 小部件中標記了它)。我期待的是"stajTuru"JSON 檔案中的串列。
["Ortopedi", "Kardiyoloji","Dermatoloji", "Pediatri"]
由于存在嵌套串列格式。我試圖執行print(items[0][0].toString());以獲取第一項的內容。但是,我收到這樣的錯誤
Class 'FormContent' has no instance method '[]'.Receiver: Instance of 'FormContent' Tried calling: [](0)
總而言之,我需要將這些 JSON 內容轉換為單獨的List<String>. 就像我在上面期待的那樣。
JSON 檔案
[
{
"stajTuru": [ "Ortopedi", "Kardiyoloji","Dermatoloji", "Pediatri"],
"cinsiyet": ["Erkek","Kad?n", "Di?er"],
"etkilesimTuru": [ "G?zlem", "Yard?mla yapma","Yard?ms?z yapma","Sanal olgu"],
"kapsam": [ "?ykü", "Fizik Bak?", "Tan?sal ak?l Yürütme", "Terop?tik ak?l yürütme"],
"ortam": ["Poliklinik","Servis","Acil","Ameliyathane","D?? Kurum"],
"doktor": [ "Esra Demir","Mehmet U?ar","Kemal Yurdakul","Fehmi ?ztürk","Mehmet ?z"]
}
]
表單內容類
這是我的班級,我保存了每個串列
class FormContent{
late List<dynamic> _cinsiyetItems;
late List<dynamic> _stajTuruItems;
late List<dynamic> _etkilesimTuruItems;
late List<dynamic> _kapsamItems;
late List<dynamic> _ortamItems;
late List<dynamic> _doktorItems;
FormContent.fromJson(Map<String,dynamic> jsonFile){
_cinsiyetItems=jsonFile['cinsiyet']!.toList();
_stajTuruItems=jsonFile['stajTuru']!.toList();
_etkilesimTuruItems=jsonFile['etkilesimTuru']!.toList();
_kapsamItems=jsonFile['kapsam']!.toList();
_ortamItems=jsonFile['ortam']!.toList();
_doktorItems=jsonFile['doktor']!.toList();
}
}
讀取JSON的方法
這是我將 JSON 資料轉換為串列的方法
Future<List<dynamic>> readJsonData() async{
final jsonData = await rootBundle.rootBundle.loadString('assets/json/formdata.json');
print(jsonData.toString());
final list = json.decode(jsonData) as List<dynamic>;
print("======================================");
print(list.toString());
var result =list.map((e) => FormContent.fromJson(e)).toList();
print("------------------------------------------");
print(result.toString());
return result;
}
FutureBuilder 方法
最后,這是我的 FutureBuilder 來執行資料
FutureBuilder(
future:readJsonData() ,
builder: (context,snapshot){
if(snapshot.hasError){
return Text(snapshot.error.toString());
}else if(snapshot.hasData){
var items =snapshot.data as List<dynamic>;
print("--------------***********************************");
print(items[0].toString()); // <--- HERE
return
ListView(
children: [
myTextFieldRow("Kay?t No: ", 10,_formData.setKayitNo),
myDropDownContainer(_valueStajTuru,_stajTuruItems,
hintTextStajTuru, onChangedStajTuru),
// myDropDownContainer(_valueDoktor, _doktorItems, hintTextDoktor, onChangedDoktor),
myTextFieldRow("Hastan?n Ya??:", 3, _formData.setYas),
// myDropDownContainer(_valueCinsiyet, _cinsiyetItems, hintTextCinsiyet, onChangedCinsiyet),
myTextFieldRow("?ikayet:", 10,_formData.setSikayet),
myTextFieldRow("Ay?r?c? Tan?:", 50,_formData.setAyiriciTani),
myTextFieldRow("Kesin Tan?:", 50,_formData.setKesinTani),
myTextFieldRow("Tedavi Y?ntemi:", 100,_formData.setTedaviYontemi),
// myDropDownContainer(_valueEtkilesim, _etkilesimTuruItems, hintTextEtkilesim, onChangedEtkilesim),
// myDropDownContainer(_valueKapsam, _kapsamItems, hintTextKapsam, onChangedKapsam),
// myDropDownContainer(_valueOrtam, _ortamItems, hintTextOrtam, onChangedOrtam),
const SizedBox(
height: 20,
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
SizedBox(
width: 150,
height: 50,
child: TextButton(
onPressed: () {
setState(() {
_formAdd.addNewFormToList(_formData);
_formData=FormData();
Navigator.push(context, MaterialPageRoute(builder: (context)=> StudentProfile(formAdd: _formAdd)));
});
},
child: Text(
"G?NDER",
style: kTextStyle.copyWith(fontSize: 20),
),
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all<Color>(
const Color(0xff4F4DBB),
),
),
),
),
],
),
],
);
} else{
return const Center(child:CircularProgressIndicator(),);
}
}
)),
uj5u.com熱心網友回復:
首先,您的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']];
}
至于您的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),
];
}
對于這個問題:
在我列印專案的第一項的最后,作為執行結果,我得到了“FormContent”的實體(我在下面的 FutureBuilder 小部件中標記了它)。我期待的是 JSON 檔案中的“stajTuru”串列。
您只是列印出您從中獲得的第一個元素,該元素readJsonData是您的FormContent類的實體。你可以print(items[0].stajTuruItems);看看stajTuru列印出來的串列。
uj5u.com熱心網友回復:
你犯了一個錯誤,表單內容屬性需要公開,
print(items[0][0].toString());
這個呼叫首先item[0]不是一個串列,它是一個物件,它具有 _cinsiyetItems、_stajTuruItems 等屬性。
items[0] 是表單內容的一個實體,您需要訪問第一個元素,您需要訪問表單內容的屬性,例如
items[0]. _cinsiyetItems
在這里您可以找到包含的串列字串,對于您需要呼叫的第一個字串
items[0]. _cinsiyetItems[0] // Erkek
并查看鏈接
uj5u.com熱心網友回復:
所以你有一個串列串列,并將它變成一個包含一堆串列的類,但是你忘記了實作一種方法來訪問所述串列中的資訊。
如果你想得到串列,你應該做這樣的事情:
class FormContent{
late List<dynamic> _cinsiyetItems;
late List<dynamic> _stajTuruItems;
late List<dynamic> _etkilesimTuruItems;
late List<dynamic> _kapsamItems;
late List<dynamic> _ortamItems;
late List<dynamic> _doktorItems;
List<dynamic> get firstList => _cinsiyetItems;
List<dynamic> get secondList => _stajTuruItems;
List<dynamic> get thirdList => _etkilesimTuruItems;
List<dynamic> get fourthList => _kapsamItems;
List<dynamic> get fifthList => _ortamItems;
List<dynamic> get sixthList => _doktorItems;
FormContent.fromJson(Map<String,dynamic> jsonFile){
_cinsiyetItems=jsonFile['cinsiyet']!.toList();
_stajTuruItems=jsonFile['stajTuru']!.toList();
_etkilesimTuruItems=jsonFile['etkilesimTuru']!.toList();
_kapsamItems=jsonFile['kapsam']!.toList();
_ortamItems=jsonFile['ortam']!.toList();
_doktorItems=jsonFile['doktor']!.toList();
}
}
這樣你就可以通過這樣做來訪問你想要的值你items[0].firstList
也可以像這樣制作一個串列getter:
class FormContent{
late List<dynamic> _cinsiyetItems;
late List<dynamic> _stajTuruItems;
late List<dynamic> _etkilesimTuruItems;
late List<dynamic> _kapsamItems;
late List<dynamic> _ortamItems;
late List<dynamic> _doktorItems;
List<List<dynamic>> get values => [
_cinsiyetItems,
_stajTuruItems,
_etkilesimTuruItems,
_kapsamItems,
_ortamItems,
_doktorItems,
];
FormContent.fromJson(Map<String,dynamic> jsonFile){
_cinsiyetItems=jsonFile['cinsiyet']!.toList();
_stajTuruItems=jsonFile['stajTuru']!.toList();
_etkilesimTuruItems=jsonFile['etkilesimTuru']!.toList();
_kapsamItems=jsonFile['kapsam']!.toList();
_ortamItems=jsonFile['ortam']!.toList();
_doktorItems=jsonFile['doktor']!.toList();
}
}
通過這種方式,您可以像這樣訪問值: items[0].values[0]
最后,要在列印 items 變數時列印值,您需要覆寫 toString 方法:
class FormContent{
late List<dynamic> _cinsiyetItems;
late List<dynamic> _stajTuruItems;
late List<dynamic> _etkilesimTuruItems;
late List<dynamic> _kapsamItems;
late List<dynamic> _ortamItems;
late List<dynamic> _doktorItems;
List<List<dynamic>> get values => [
_cinsiyetItems,
_stajTuruItems,
_etkilesimTuruItems,
_kapsamItems,
_ortamItems,
_doktorItems,
];
FormContent.fromJson(Map<String,dynamic> jsonFile){
_cinsiyetItems=jsonFile['cinsiyet']!.toList();
_stajTuruItems=jsonFile['stajTuru']!.toList();
_etkilesimTuruItems=jsonFile['etkilesimTuru']!.toList();
_kapsamItems=jsonFile['kapsam']!.toList();
_ortamItems=jsonFile['ortam']!.toList();
_doktorItems=jsonFile['doktor']!.toList();
}
@override
String toString() {
return '[$_cinsiyetItems, $_stajTuruItems, $_etkilesimTuruItems, $_kapsamItems, $_ortamItems, $doktorItems]';
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/385791.html
