You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter类型不匹配问题:List<FlashcardsList>无法转为List<Back>如何修复?

解决 type 'List<FlashcardsList>' is not a subtype of type 'List<Back>' 错误

嘿,我来帮你搞定这个问题!这个报错的核心原因非常明确:你声明的List<Back>_back需要的是Back类型的对象列表,但你实际赋值的back列表里装的是FlashcardsList实例,类型不兼容直接导致了这个错误。另外你的Back类定义和数据初始化也有一些小问题,我一步步帮你修正:

第一步:修正Back类定义与数据列表

你的Back类继承自FlashcardsList,但构造函数没有正确初始化父类属性,而且命名也不符合Dart的小驼峰规范。同时back列表里的元素必须是Back实例,不能是FlashcardsList。修改你的列表文件代码:

import 'package:assets_audio_player/assets_audio_player.dart';

class FlashcardsList{
  final String pictures1;
  final String name;
  final String sound1;
  final String pictures2;
  final String sound2;

  FlashcardsList({
    this.pictures1,
    this.name,
    this.sound1,
    this.pictures2,
    this.sound2
  });
}

final flashcardsList = [
  FlashcardsList(
    pictures1: 'assets/Ba.PNG',
    name: 'Ba',
    sound1: 'audioAssets/Ba.mp3',
  ),
  FlashcardsList(
    pictures1: 'assets/KA.PNG',
    name: 'Ka',
    sound1: 'audioAssets/Ka.mp3',
  ),
];

// 修正Back类:正确继承父类属性,规范命名
class Back extends FlashcardsList{
  Back({
    String pictures2,
    String sound2,
  }) : super(
    pictures2: pictures2,
    sound2: sound2,
  );
}

// 现在back列表里的元素是Back类型实例,与声明的类型匹配
final back = [
  Back(
    pictures2: 'assets/A.PNG',
    sound2: 'audioAssets/La.mp3',
  ),
  Back(
    pictures2: 'assets/XXX.PNG',
    sound2: 'audioAssets/XXX.mp3',
  ),
];

第二步:修正主页面的类型匹配与功能补充

现在back列表是List<Back>类型了,和你声明的变量类型完全匹配,不会再出现类型不兼容的报错。另外我帮你补充了背面的音频播放逻辑,让正反两面都能发声:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:carousel_slider/carousel_slider.dart';
import 'package:assets_audio_player/assets_audio_player.dart';
import 'package:baybay_app/FlashCards/FlashcardsList.dart';
import 'package:flip_card/flip_card.dart';

class Flashcards extends StatefulWidget {
  final List<FlashcardsList> _flashCardsList = flashcardsList;
  final List<Back> _back = back;

  @override
  _FlashcardsState createState() => _FlashcardsState();
}

class _FlashcardsState extends State<Flashcards> {
  GlobalKey<FlipCardState> cardKey = GlobalKey<FlipCardState>();
  CarouselController buttonCarouselController = CarouselController();
  List<FlashcardsList> flashCardsList;
  List<Back> back;

  @override
  void initState() {
    super.initState();
    flashCardsList = widget._flashCardsList;
    back = widget._back;
  }

  Widget build(BuildContext context) => Scaffold(
    appBar: AppBar(title: Text('Sample Carousel')),
    body: Column(children: <Widget>[
      CarouselSlider.builder(
        itemBuilder: (context, index) {
          return FlipCard(
            front: ListTile(
              onLongPress: () => onPlayAudio(index),
              title: Container(
                child: Image(image: AssetImage(widget._flashCardsList[index].pictures1)),
              ),
            ),
            back: ListTile(
              onLongPress: () => playBackAudio(index),
              title: Container(
                child: Image(image: AssetImage(widget._back[index].pictures2)),
              ),
            ),
          );
        },
        itemCount: widget._flashCardsList.length,
        options: CarouselOptions(
          autoPlay: false,
          enlargeCenterPage: true,
          viewportFraction: 0.9,
          initialPage: 2,
        ),
      ),
    ]),
  );

  void onPlayAudio(index) async{
    AssetsAudioPlayer assetsAudioPlayer = AssetsAudioPlayer();
    await assetsAudioPlayer.open(Audio(widget._flashCardsList[index].sound1));
  }

  void playBackAudio(index) async{
    AssetsAudioPlayer assetsAudioPlayer = AssetsAudioPlayer();
    await assetsAudioPlayer.open(Audio(widget._back[index].sound2));
  }
}

额外小建议:简化数据结构

其实你完全可以不用单独的Back类,因为FlashcardsList已经包含了pictures2和sound2属性,直接用同一个列表存储正反面的信息会更简洁,彻底避免类型匹配问题。比如直接在flashcardsList里填充好正反面的图片和音频,FlipCard的back直接调用widget._flashCardsList[index].pictures2和widget._flashCardsList[index].sound2即可。

内容的提问来源于stack exchange,提问作者John Ryle Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:53:26