我对Flutter还是很陌生,想渲染一个ListView。但是我得到一个错误。
我有3个模型类:
主题,主题和内容。
这是模型文件topic.dart
:
import './content.dart';
class Topic {
String name;
List<Content> contents;
Topic(this.name, this.contents);
factory Topic.fromJSON(Map<String, dynamic> json) {
if (json != null) {
return Topic(json['name'], json['contents'].cast<Content>());
} else {
return null;
}
}
}
这是topics_page.dart
文件:
import 'package:flutter/material.dart';
import './../models/subject.dart';
class TopicsPage extends StatefulWidget {
final Subject _subject;
TopicsPage(this._subject);
@override
State<StatefulWidget> createState() {
return _TopicsPageState();
}
}
class _TopicsPageState extends State<TopicsPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget._subject.name),
),
body: Container(
child: ListView.separated(
separatorBuilder: (BuildContext context, int index) => Divider(
color: Colors.grey[200],
thickness: 1.5,
),
itemCount: widget._subject.topics.length,
itemBuilder: (BuildContext context, int index) {
return InkWell(
onTap: () {
Navigator.of(context).pushNamed('/contents',
arguments: widget._subject.topics[index]);
},
child: ListTile(
title: Text(
widget._subject.topics[index].name,
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.w500,
letterSpacing: 0.3),
),
),
);
},
),
));
}
}
问题在widget._subject.topics[index].name
处出现。
错误消息是:type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Topic' in type cast
现在我需要一些帮助,以找出可能的解决方案!
有什么想法吗?
谢谢!
更新
content.dart
:
class Content {
String title;
String body;
Content(this.title, this.body);
factory Content.fromJSON(Map<String, dynamic> json) {
if (json != null) {
return Content(json['title'], json['body']);
} else {
return null;
}
}
}
subject.dart
import './topic.dart';
class Subject {
String name;
List<Topic> topics;
Subject(this.name, this.topics);
factory Subject.fromJSON(Map<String, dynamic> json) {
if (json != null) {
return Subject(json['name'], json['topics'].cast<Topic>());
} else {
return null;
}
}
}
这是我的其他模型文件。
请告诉我我错了!谢谢!
更新2
现在我收到错误消息:The argument type 'Content' can't be assigned to the parameter type 'List<Topic>'
...
这是您建议的新代码:
import './content.dart';
class Topic {
String id;
String name;
int order;
bool isImportant;
List<Topic> contents;
Topic({this.id, this.name, this.order, this.isImportant, this.contents});
factory Topic.fromJSON(Map<String, dynamic> json) {
if (json != null) {
return Topic(
name: json['name'],
order: json['order'],
isImportant: json['isImportant'],
contents: Content.fromJSON(json['contents'] as Map<String, dynamic>));
} else {
return null;
}
}
}
答案 0 :(得分:2)
假设您的Content
是一门课,您的主题内容应将json['contents']
映射到您的Content
工厂
在您的内容中
factory Content.fromJSON(Map<String, dynamic> json) {
if (json != null) {
return Content(json['content1']);
} else {
return null;
}
}
在您的主题中:
factory Topic.fromJSON(Map<String, dynamic> json) {
if (json != null) {
return Topic(json['name'], Content.fromJson(json['content'] as Map<String, dynamic>);
} else {
return null;
}
}
最后,在定义您的类之后,您实际上可以使用JsonSerializer为您生成所有这些。 Here's文档。希望这会有所帮助。
答案 1 :(得分:0)
使用var
代替Map<String, dynamic>
class Content {
String title;
String body;
Content(this.title, this.body);
factory Content.fromJSON(var json) {
if (json != null) {
return Content(json['title'], json['body']);
} else {
return null;
}
}
}