【发布时间】:2021-10-23 09:02:20
【问题描述】:
我有一个结构如下的 json 文件:
[
{
"name": "Kejadian",
"playList": "Kejadian",
"videos": [
"q2ZZlUsnX5Y",
"ANpas6oyZjw",
"5qwP-SOEdKg",
"hWm62l-d3DE",
"F07RJdvQ77w",
]
},
...
]
我可以获取除videos 数组之外的该列表的所有数据,当我尝试获取我的videos 的字符串列表时,它说:
type 'List<dynamic>' is not a subtype of type 'List<String>'
这是我的代码:
my json file class
class VideoDetails {
final String name, playList;
final List<String> videos;
VideoDetails({
required this.name,
required this.playList,
required this.videos,
});
factory VideoDetails.fromJson(Map<String, dynamic> json) {
return VideoDetails(
name: json['name'],
playList: json['playList'],
videos: json["videos"],
);
}
}
getting data from my json file
getPlayerList() async {
String data = await DefaultAssetBundle.of(context).loadString("assets/lists/v-player.json");
final jsonResult = jsonDecode(data);
return jsonResult;
}
returning data of my list in FutureBuilder
FutureBuilder(
future: getPlayerList(),
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.data == null) {
return const Center(child: Text("Loading..."), );
} else {
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
var item = snapshot.data[index];
return ListTile(
leading: const FaIcon(FontAwesomeIcons.video),
title: Text(item['name']),
trailing: Row(
mainAxisSize: MainAxisSize.min,
children: [
Text('${item['videos'].length}'),
const Icon(Icons.arrow_forward_ios_rounded),
],
),
onTap: () {
if(item['videos'].isNotEmpty) {
Navigator.pushNamed(context, '/player', arguments: VideoArguments(
item['name'],
item['playList'],
item['videos'], // error caused here.
));
} else {
//...
}
},
);
}
);
}
}
)
在我获得视频列表的第二个屏幕中(在上面的代码中注释)我有以下代码:
class VideoListPlayer extends StatefulWidget {
final List<String> videosList; // getting videos list
final String playList;
const VideoListPlayer({Key? key, required this.videosList, required this.playList}) : super(key: key);
@override
_VideoListPlayerState createState() => _VideoListPlayerState();
}
这也是我的参数类,视频列表应该发送到第二个屏幕:
class VideoArguments {
final String name;
final String playList;
final List<String> videos;
VideoArguments(this.name, this.playList, this.videos);
}
有什么建议吗?
【问题讨论】:
-
用这个更新你的
videos: json["videos"],:videos: json["videos"].cast<String>(), -
@KishanDhankecha 没用
-
我在您的代码中找不到将 json 转换为 VideoDetails 的地方
-
我已经分享了我的解决方案。谢谢