【问题标题】:Flutter List<dynamic> is not a subtype of type List<String>Flutter List<dynamic> 不是 List<String> 类型的子类型
【发布时间】: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&lt;String&gt;(),
  • @KishanDhankecha 没用
  • 我在您的代码中找不到将 json 转换为 VideoDetails 的地方
  • 我已经分享了我的解决方案。谢谢

标签: flutter dart


【解决方案1】:

解决方案

解决此问题的方法是:

List.from()

code

Navigator.pushNamed(context, '/player', arguments: VideoArguments(
  item['name'],
  item['playList'],
  List.from(item['videos']),
));

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2022-12-02
    • 2022-11-11
    • 2023-01-07
    • 2021-07-02
    • 2021-12-29
    • 2023-01-08
    • 2020-10-03
    • 2021-07-17
    相关资源
    最近更新 更多