将2个GET方法(电影集合)组合为一个,并在单个ListView中显示它们



我目前正在使用TMDB API,我正在尝试组合GET方法的两个映射,并将它们显示在一个ListView中(基本上我正在尝试将两个电影集合组合为一个(。

这是我的应用程序主屏幕的代码(不要称之为应用程序,它更像是一个"训练场"(。

class _HomeScreenState extends State<HomeScreen> {
List trendingMovies = [];
List topRatedMovies = [];
List tvShows = [];
List genre = [];
List scienceFiction = [];
List starWars = [];
List batman = [];
final String apiKey = 'myapikey';
final String readAccessToken = 'myreadaccesstoken';
int collectionId;
@override
void initState() {
loadMovies();
super.initState();
}
loadMovies()async{
TMDB tmdbWithCustomLogs = TMDB(
ApiKeys(
apiKey,
readAccessToken
),
logConfig: ConfigLogger(
showLogs: true,
showErrorLogs: true
)
);
Map trendingResult = await tmdbWithCustomLogs.v3.trending.getTrending();
Map topRatedResult = await tmdbWithCustomLogs.v3.movies.getTopRated();
Map tvShowsResult = await tmdbWithCustomLogs.v3.tv.getPouplar();
Map genreResult = await tmdbWithCustomLogs.v3.geners.getMovieList();
Map scienceFictionResult = await tmdbWithCustomLogs.v3.movies.getPouplar();
Map starWarsResult = await tmdbWithCustomLogs.v3.collections.getDetails(collectionId = 10);
//THE RELEVANT CODE
Map batmanResult = await tmdbWithCustomLogs.v3.collections.getDetails(collectionId = 120794);
Map batmanResult2 = await tmdbWithCustomLogs.v3.collections.getDetails(collectionId = 263);
//THE RELEVANT CODE ENDS HERE
setState(() {
trendingMovies = trendingResult['results'];
topRatedMovies = topRatedResult['results'];
tvShows = tvShowsResult['results'];
genre = genreResult['genres'];
scienceFiction = scienceFictionResult['results'];
starWars = starWarsResult['parts'];
//THE RELEVANT CODE
batman = [batmanResult['parts'], batmanResult2['parts']];
//THE RELEVANT CODE ENDS HERE
});
print(genre);
}

这是显示ListView 的代码

class BatmanMovies extends StatelessWidget {
final List batman;
const BatmanMovies({Key key, this.batman}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ModifiedText(
text: 'I'm Vengeance, I'm The Night, I'm Batman',
size: 25,
weight: FontWeight.bold,
color: Colors.blue,
),
SizedBox(height: 10),
Container(
height: 210,
child: ListView.builder(
scrollDirection: Axis.horizontal,
itemCount: batman.length,
itemBuilder: (context, index) {
return InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => DetailScreen(
title: batman[index]['title'],
bannerURL: 'https://image.tmdb.org/t/p/w500'+batman[index]['backdrop_path'],
posterURL: 'https://image.tmdb.org/t/p/w500'+batman[index]['poster_path'],
synopsis: batman[index]['overview'],
rating: batman[index]['vote_average'].toString(),
releasedOn: batman[index]['release_date'],
id: batman[index]['id'].toString(),
))
);
},
child: Container(
width: 140,
child: Column(
children: [
Container(
height: 200,
decoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage(
'https://image.tmdb.org/t/p/w500'+batman[index]['poster_path']
)
)
),
),
],
),
),
);
}
),
)
],
),
);
}
}

但当我运行它时,我会得到以下错误,

======== Exception caught by widgets library =======================================================
The following _TypeError was thrown building:
type 'String' is not a subtype of type 'int' of 'index'
When the exception was thrown, this was the stack: 
#0      BatmanMovies.build.<anonymous closure> (package:asteric/categories/batman.dart:55:88)
#1      SliverChildBuilderDelegate.build (package:flutter/src/widgets/sliver.dart:455:22)
#2      SliverMultiBoxAdaptorElement._build (package:flutter/src/widgets/sliver.dart:1201:28)
#3      SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1214:55)
#4      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2647:19)
...
====================================================================================================

有什么东西我应该添加或更改到我的代码中,还是不可能完成我想要做的事情?

感谢并抱歉我的措辞,我是一个角落的编程一般。

一个更简单的例子

这是类MovieDB。可以将其视为从中获取电影收藏详细信息的数据库

class MovieDB {
Map batmanResult = {
'id': 69,
'parts': [
{
"id": 11,
"title": "Star Wars: Episode IV - A New Hope",
},
{
"id": 12,
"title": "Star Wars: Episode V - A Greater Hope",
}
]
};
Map batmanResult2 = {
'id': 420,
'parts': [
{
"id": 1,
"title": "Star Wars: Episode VI - A much needed Hope",
}
]
};
}

MovieDB实例db的帮助下,您可以执行以下操作:

List batman = [db.batmanResult['parts'], db.batmanResult2['parts']];

错误

batman现在是映射列表的列表-List<List<Map>>和NOTList<Map>

因此,您将访问像batman[0][0]['id']这样的第一部电影,而不是batman[0]['id'](它给出了您提到的错误(,这非常麻烦,因为您必须跟踪两个列表中的每个列表中的项目数量。

解决方案

创建一个新的列表batmanMovies,迭代batman并将每个电影添加到该列表中。

List batmanMovies = [];

batman.forEach((list) {
for (int i = 0; i < list.length; i++) {
batmanMovies.add(list[i]);
}
});

现在您可以正确访问每部电影:

print(batmanMovies[2]['title'])

输出

Star Wars: Episode VI - Sigh

最新更新