将数据从一个视图传递到另一个视图时出现 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。