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
相关产品推荐
相关产品推荐

