将数据从一个视图传递到另一个视图时出现 Flutter 错误。错误类型 'Song' 不是类型 'Song' 的子类型
Flutter error when passing data from one view to another. Error type 'Song' is not a subtype of type 'Song'
我正在尝试将歌曲详细信息从以下文件 Songs_list.dart 传递到 home_screen.dart,但我得到一个错误,类型 'Song' 不是类型 'song' 的子类型,其中歌曲来自......Songs_list.dart
进口'package:flutter/material.dart';
import 'package:nyimbo_cia_ngai/models/Songs_All.dart';
import 'package:nyimbo_cia_ngai/screens/home_screen.dart';
class SongsList extends StatefulWidget {
//static String tag = 'Songlist-page';
@override State<StatefulWidget> createState() {
return new _SongsListState();
}
}
class _SongsListState extends State<SongsList> {
TextEditingController searchController = new TextEditingController();
String filter;
@override initState() {
searchController.addListener(() {
setState(() {
filter = searchController.text;
});
});
}
@override void dispose() {
searchController.dispose();
super.dispose();
}
@override Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).primaryColor,
appBar: AppBar( leading: IconButton(
icon: Icon(Icons.menu),
iconSize: 30.0,
color: Colors.white,
onPressed: (){},
),
title: Text('Nyimbo Cia Kuinira Ngai', style: TextStyle(fontSize: 20.0,
),),
elevation: 0.0,
actions: <Widget>[
IconButton(
icon: Icon(Icons.search),
iconSize: 30.0,
color: Colors.white,
onPressed: (){},
),
],
),
body: new Column(
children: <Widget>[
//Search box
new Padding(
padding: new EdgeInsets.all(8.0),
child: new TextField(
controller: searchController,
decoration: InputDecoration(
hintText: 'Search Song',
contentPadding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(32.0),
borderSide: BorderSide(color: Colors.white)
),
),
),
//search Box end
),
new Expanded(
child: Container(
decoration: BoxDecoration(color: Theme.of(context).accentColor,
borderRadius: BorderRadius.only(topLeft: Radius.circular(30.0),topRight: Radius.circular(30.0),
),
),
///////////////////////////////////////////////////////////////////
child: new ListView.builder(
itemCount: Songs.length,
itemBuilder: (context, index) {
// if filter is null or empty returns all data
return filter == null || filter == "" ? ListTile(
title: Text(
'${Songs[index].SongName}',
),
subtitle: Text('${Songs[index].SongNumber}'),
leading: new CircleAvatar(
backgroundColor: Theme.of(context).primaryColor,
child: Text(
'${Songs[index].SongNumber.substring(0, 3)}')),
onTap: () =>
Navigator.push(context, MaterialPageRoute(builder: (context)=>HomeScreen(Songs[index] ?? '')))
//_onTapItem(context, Songs[index] ?? ''),
)
: '${Songs[index].SongNumber}'.toLowerCase()//search using the song number
.contains(filter.toLowerCase())
? ListTile(
title: Text(
'${Songs[index].SongName}',
),
subtitle: Text('${Songs[index].SongNumber}'),
leading: new CircleAvatar(
backgroundColor: Theme.of(context).primaryColor,
child: Text(
'${Songs[index].SongNumber.substring(0, 3)}')),
onTap: () =>
Navigator.push(context, MaterialPageRoute(builder: (context)=>HomeScreen(Songs[index]?? '')))
//_onTapItem(context, Songs[index]?? ''),
)
: new Container();
},
),
//////////////////////////////////////////////////////////////////
),
),
],
));
}
void _onTapItem(BuildContext context, Song post) {
}
}
class Song {
final String SongNumber;
final String SongName;
const Song({this.SongNumber, this.SongName});
}
Songs_list.dart 正在从 Songs_all.dart 获取数据,这是正确发生的
import 'package:flutter/material.dart';
class Song{
String SongName;
String SongNumber;
String verses;
Song(
{
@required this.SongName,
@required this.SongNumber,
@required this.verses});
}
List<Song> Songs =[
Song(
SongNumber:'002',
SongName:'HE NYUMBA NJEGA THIINI WA ANDU',
verses:'1 . He nyumba njega thiini wa andu'
但是当用户点击歌曲以打开其详细信息时,会出现错误。 ontap 应该在以下页面中打开 home_screen.dart
import 'package:flutter/material.dart';
import 'package:nyimbo_cia_ngai/screens/Songs_list.dart';
class HomeScreen extends StatelessWidget {
final Song song;
HomeScreen(this.song);
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: Text(''),
),
);
}
}
使用 ontap 传递详细信息时我哪里会出错?
您正在使用不同的class“歌曲”
SongsList : import 'package:nyimbo_cia_ngai/models/Songs_All.dart';
HomeScreen : import 'package:nyimbo_cia_ngai/screens/Songs_list.dart';
这不是什么大问题,只要确保您导入的是相同的 class。
我正在尝试将歌曲详细信息从以下文件 Songs_list.dart 传递到 home_screen.dart,但我得到一个错误,类型 'Song' 不是类型 'song' 的子类型,其中歌曲来自......Songs_list.dart
进口'package:flutter/material.dart';
import 'package:nyimbo_cia_ngai/models/Songs_All.dart';
import 'package:nyimbo_cia_ngai/screens/home_screen.dart';
class SongsList extends StatefulWidget {
//static String tag = 'Songlist-page';
@override State<StatefulWidget> createState() {
return new _SongsListState();
}
}
class _SongsListState extends State<SongsList> {
TextEditingController searchController = new TextEditingController();
String filter;
@override initState() {
searchController.addListener(() {
setState(() {
filter = searchController.text;
});
});
}
@override void dispose() {
searchController.dispose();
super.dispose();
}
@override Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Theme.of(context).primaryColor,
appBar: AppBar( leading: IconButton(
icon: Icon(Icons.menu),
iconSize: 30.0,
color: Colors.white,
onPressed: (){},
),
title: Text('Nyimbo Cia Kuinira Ngai', style: TextStyle(fontSize: 20.0,
),),
elevation: 0.0,
actions: <Widget>[
IconButton(
icon: Icon(Icons.search),
iconSize: 30.0,
color: Colors.white,
onPressed: (){},
),
],
),
body: new Column(
children: <Widget>[
//Search box
new Padding(
padding: new EdgeInsets.all(8.0),
child: new TextField(
controller: searchController,
decoration: InputDecoration(
hintText: 'Search Song',
contentPadding: EdgeInsets.fromLTRB(20.0, 15.0, 20.0, 15.0),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(32.0),
borderSide: BorderSide(color: Colors.white)
),
),
),
//search Box end
),
new Expanded(
child: Container(
decoration: BoxDecoration(color: Theme.of(context).accentColor,
borderRadius: BorderRadius.only(topLeft: Radius.circular(30.0),topRight: Radius.circular(30.0),
),
),
///////////////////////////////////////////////////////////////////
child: new ListView.builder(
itemCount: Songs.length,
itemBuilder: (context, index) {
// if filter is null or empty returns all data
return filter == null || filter == "" ? ListTile(
title: Text(
'${Songs[index].SongName}',
),
subtitle: Text('${Songs[index].SongNumber}'),
leading: new CircleAvatar(
backgroundColor: Theme.of(context).primaryColor,
child: Text(
'${Songs[index].SongNumber.substring(0, 3)}')),
onTap: () =>
Navigator.push(context, MaterialPageRoute(builder: (context)=>HomeScreen(Songs[index] ?? '')))
//_onTapItem(context, Songs[index] ?? ''),
)
: '${Songs[index].SongNumber}'.toLowerCase()//search using the song number
.contains(filter.toLowerCase())
? ListTile(
title: Text(
'${Songs[index].SongName}',
),
subtitle: Text('${Songs[index].SongNumber}'),
leading: new CircleAvatar(
backgroundColor: Theme.of(context).primaryColor,
child: Text(
'${Songs[index].SongNumber.substring(0, 3)}')),
onTap: () =>
Navigator.push(context, MaterialPageRoute(builder: (context)=>HomeScreen(Songs[index]?? '')))
//_onTapItem(context, Songs[index]?? ''),
)
: new Container();
},
),
//////////////////////////////////////////////////////////////////
),
),
],
));
}
void _onTapItem(BuildContext context, Song post) {
}
}
class Song {
final String SongNumber;
final String SongName;
const Song({this.SongNumber, this.SongName});
}
Songs_list.dart 正在从 Songs_all.dart 获取数据,这是正确发生的
import 'package:flutter/material.dart';
class Song{
String SongName;
String SongNumber;
String verses;
Song(
{
@required this.SongName,
@required this.SongNumber,
@required this.verses});
}
List<Song> Songs =[
Song(
SongNumber:'002',
SongName:'HE NYUMBA NJEGA THIINI WA ANDU',
verses:'1 . He nyumba njega thiini wa andu'
但是当用户点击歌曲以打开其详细信息时,会出现错误。 ontap 应该在以下页面中打开 home_screen.dart
import 'package:flutter/material.dart';
import 'package:nyimbo_cia_ngai/screens/Songs_list.dart';
class HomeScreen extends StatelessWidget {
final Song song;
HomeScreen(this.song);
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: Text(''),
),
);
}
}
使用 ontap 传递详细信息时我哪里会出错?
您正在使用不同的class“歌曲”
SongsList : import 'package:nyimbo_cia_ngai/models/Songs_All.dart';
HomeScreen : import 'package:nyimbo_cia_ngai/screens/Songs_list.dart';
这不是什么大问题,只要确保您导入的是相同的 class。