json - 输入'列表' 不是类型 'List 的子类型'函数结果'
问题描述
我想将List data;
(List < dynamic> data) 更改为 List<MaintenanceInfo> data;
class MaintenanceInfo {
final String serial;
MaintenanceInfo({this.serial,});
factory MaintenanceInfo.fromJson(Map<String, dynamic> json) {
return new MaintenanceInfo(
serial: json['serial'], );}}
或者有什么方法可以将 JSON 数据提取为 forEach?
我正在尝试遵循此示例(https://stackoverflow.com/a/50569613/12908336)并面临这样的问题。
解决方案
查看我为您创建的这个示例:
import 'dart:async';
import 'package:flutter/material.dart';
import 'dart:convert';
//import 'package:http/http.dart' as http;
void main() => runApp(new MaterialApp(
home: new HomePage(),
debugShowCheckedModeBanner: false,
));
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => new _HomePageState();
}
class _HomePageState extends State<HomePage> {
TextEditingController controller = new TextEditingController();
String apiData =
'''{"ResultText": "Success","ResultStatus": 0,"data": [{"serial": "sample1"},{"serial": "sample2"},{"serial": "sample3"},{"serial": "sample4"},{"serial": "sample5"},{"serial": "sample6"}]} ''';
// Get json result and convert it to model. Then add
Future<Null> getUserDetails() async {
// final response = await http.get(url);
// final responseJson = json.decode(response.body);
// this is where you apis gets hit i have taken the sample json you provided.
final maintenanceInfo = maintenanceInfoFromJson(apiData);
setState(() {
/* for (Map user in responseJson) {
_userDetails.add(UserDetails.fromJson(user));
} */
maintenanceInfo.data.forEach((element) {
_userDetails.add(element);
});
});
}
@override
void initState() {
super.initState();
getUserDetails();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('Home'),
elevation: 0.0,
),
body: new Column(
children: <Widget>[
new Container(
color: Theme.of(context).primaryColor,
child: new Padding(
padding: const EdgeInsets.all(8.0),
child: new Card(
child: new ListTile(
leading: new Icon(Icons.search),
title: new TextField(
controller: controller,
decoration: new InputDecoration(
hintText: 'Search', border: InputBorder.none),
onChanged: onSearchTextChanged,
),
trailing: new IconButton(
icon: new Icon(Icons.cancel),
onPressed: () {
controller.clear();
onSearchTextChanged('');
},
),
),
),
),
),
new Expanded(
child: _searchResult.length != 0 || controller.text.isNotEmpty
? new ListView.builder(
itemCount: _searchResult.length,
itemBuilder: (context, i) {
return new Card(
child: new ListTile(
title: new Text(_searchResult[i].serial),
),
margin: const EdgeInsets.all(0.0),
);
},
)
: new ListView.builder(
itemCount: _userDetails.length,
itemBuilder: (context, index) {
return new Card(
child: new ListTile(
title: new Text(_userDetails[index].serial),
),
margin: const EdgeInsets.all(0.0),
);
},
),
),
],
),
);
}
onSearchTextChanged(String text) async {
_searchResult.clear();
if (text.isEmpty) {
setState(() {});
return;
}
_userDetails.forEach((userDetail) {
if (userDetail.serial.contains(text)) _searchResult.add(userDetail);
});
setState(() {});
}
}
List<Serials> _searchResult = [];
List<Serials> _userDetails = [];
// To parse this JSON data, do
//
// final maintenanceInfo = maintenanceInfoFromJson(jsonString);
MaintenanceInfo maintenanceInfoFromJson(String str) =>
MaintenanceInfo.fromJson(json.decode(str));
String maintenanceInfoToJson(MaintenanceInfo data) =>
json.encode(data.toJson());
class MaintenanceInfo {
MaintenanceInfo({
this.resultText,
this.resultStatus,
this.data,
});
String resultText;
int resultStatus;
List<Serials> data;
factory MaintenanceInfo.fromJson(Map<String, dynamic> json) =>
MaintenanceInfo(
resultText: json["ResultText"],
resultStatus: json["ResultStatus"],
data: List<Serials>.from(json["data"].map((x) => Serials.fromJson(x))),
);
Map<String, dynamic> toJson() => {
"ResultText": resultText,
"ResultStatus": resultStatus,
"data": List<dynamic>.from(data.map((x) => x.toJson())),
};
}
class Serials {
Serials({
this.serial,
});
String serial;
factory Serials.fromJson(Map<String, dynamic> json) => Serials(
serial: json["serial"],
);
Map<String, dynamic> toJson() => {
"serial": serial,
};
}
让我知道它是否有效。
推荐阅读
- ios - 创建一个通用函数,将视图控制器类型作为参数并返回基于该类型的自定义视图控制器
- java - 错误告诉我运行类中的方法未定义,即使它是
- node.js - 获取正在进行的传出 Twilio 呼叫的状态
- python - 如何在 Python 中使用 sklearn 对模型进行单一预测?
- reactjs - 如何在函数 React 中将状态从父级传递给子级?
- excel - Excel 或 VBA:从多列和多张工作表进行比较的公式,然后添加数据
- assembly - 汇编中的快速 8 位乘法器
- css - 角材质垫网格列表最外边界
- python - Python 在坐标处找不到 tkinter 项目
- python - 如何合并csv文件的连续行