flutter - 类型“_InternalLinkedHashMap”不是类型的子类型
问题描述
我正在尝试使用 http 请求传递 json 数据以显示列表,当我点击其中一个列表时出现此错误:类型“_InternalLinkedHashMap”不是“Todo”类型的子类型
我需要的是在下一个屏幕的中心显示标题当我点击其中一个列表时
我是新来的颤振请帮助...
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
void main() {
runApp(new MaterialApp(
home: new HomePage(),
));
}
class HomePage extends StatefulWidget {
@override
HomePageState createState() => new HomePageState();
}
class HomePageState extends State<HomePage> {
List data;
Future<String> getData() async {
var response = await http.get(
Uri.encodeFull("https://jsonplaceholder.typicode.com/posts"),
headers: {
"Accept": "application/json"
}
);
this.setState(() {
data = jsonDecode(response.body);
});
print(data[1]["title"]);
return "Success!";
}
@override
void initState() {
super.initState();
this.getData();
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text("Listviews"),
),
body: new ListView.builder(
itemCount: data == null ? 0 : data.length,
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: () {
Navigator.push(context,
new MaterialPageRoute(builder: (context) => DetailsPage(todo: data[index]))
);
},
child: new Card(
child: new Text(data[index]["title"]),
),
);
},
),
);
}
}
class Todo {
final String title;
Todo(this.title);
}
class DetailsPage extends StatelessWidget {
final Todo todo;
DetailsPage({Key key, @required this.todo}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: new AppBar(
title: new Text("Listviews"),
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Text("todo.title"),
),
);
}
}
解决方案
您可以在下面复制粘贴运行完整代码您可以使用
代码片段
解析您的 json 字符串todoFromJson
List<Todo> todoFromJson(String str) =>
List<Todo>.from(json.decode(str).map((x) => Todo.fromJson(x)));
...
setState(() {
data = todoFromJson(response.body);
});
工作演示
完整代码
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
// To parse this JSON data, do
//
// final todo = todoFromJson(jsonString);
import 'dart:convert';
List<Todo> todoFromJson(String str) =>
List<Todo>.from(json.decode(str).map((x) => Todo.fromJson(x)));
String todoToJson(List<Todo> data) =>
json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class Todo {
int userId;
int id;
String title;
String body;
Todo({
this.userId,
this.id,
this.title,
this.body,
});
factory Todo.fromJson(Map<String, dynamic> json) => Todo(
userId: json["userId"],
id: json["id"],
title: json["title"],
body: json["body"],
);
Map<String, dynamic> toJson() => {
"userId": userId,
"id": id,
"title": title,
"body": body,
};
}
void main() {
runApp(MaterialApp(
home: HomePage(),
));
}
class HomePage extends StatefulWidget {
@override
HomePageState createState() => HomePageState();
}
class HomePageState extends State<HomePage> {
List<Todo> data;
Future<String> getData() async {
var response = await http.get(
Uri.encodeFull("https://jsonplaceholder.typicode.com/posts"),
headers: {"Accept": "application/json"});
setState(() {
data = todoFromJson(response.body);
});
return "Success!";
}
@override
void initState() {
super.initState();
getData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Listviews"),
),
body: ListView.builder(
itemCount: data == null ? 0 : data.length,
itemBuilder: (BuildContext context, int index) {
return GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DetailsPage(todo: data[index])));
},
child: Card(
child: Text(data[index].title),
),
);
},
),
);
}
}
class DetailsPage extends StatelessWidget {
final Todo todo;
DetailsPage({Key key, @required this.todo}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Listviews"),
),
body: Padding(
padding: EdgeInsets.all(16.0),
child: Text("${todo.title}"),
),
);
}
}
推荐阅读
- opencl - 我如何知道 OpenCL 内核是否正常工作?
- python - 遍历文件行直到找到用户输入
- php - Wordpress:Functions.php:为什么我声明的图像大小没有显示在模态中?
- android - Android:适配器的过滤结果总是返回 null
- python - 声明时执行函数
- android - Dagger hilt & oauth 拦截器 - 如何更新 Singleton
- azure-devops - 如何为 *.json 文件指定两个路径以在 Azure DevOps 管道中运行 ARM-TTK 测试
- java - 在 localhost 上运行的 Springboot 应用程序无法与在 docker 上运行的 redis 通信
- java - Flutter:Crashlytics 找不到 Google Services 生成的资源文件
- python - 处理链表总和中不添加额外节点的边缘情况(Leetcode 的 2. 添加两个数字)