Future生成器返回null,尽管我的列表不是空的



我有一个未来的生成器,它在我的提供者类中加载电影列表。每当我重新加载屏幕时,电影都不会返回。以下是未来的建设者

FutureBuilder(
future: movieData.getTrendingMovies(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(
child: CircularProgressIndicator(),
);
} else if (snapshot.hasData) {
return Swiper(
itemBuilder: (BuildContext context, i) {
return ChangeNotifierProvider(
create: (context) => Movie(),
child: MovieContainer(
imageUrl: movieData.movies[i].imageUrl,
id: movieData.movies[i].id,
rate: movieData.movies[i].rate,
title: movieData.movies[i].title,
),
);
},
itemCount: movieData.movies.length,
viewportFraction: 0.25,
scale: 0.4,
);
} else {
return Text(snapshot.error.toString()); // it returns null on the screen
}
}),

同样在我显示电影的主屏幕中,在构建方法之后,我创建了一个侦听器(moviesData(来侦听电影提供商中的所有更改。

final movieData = Provider.of<Movies>(context, listen: false);

以下也是使用http获取请求从restfulAPI获取电影的方法

Future<void> getTrendingMovies() async {
List<String> movieTitles = [];
List<String> movieImageUrls = [];
List<String> movieDescriptions = [];
List<String> movieReleaseDates = [];
List<String> movieRates = [];
List<String> movieIds = [];
const _apiKey = '******************************';
const url =
'https://api.themoviedb.org/3/trending/all/week?api_key=$_apiKey';
try {
final response = await http.get(Uri.parse(url));
if (response.statusCode >= 400) {
print(response.statusCode);
return;
}
final extractedData = json.decode(response.body);
List moviesList = extractedData['results'] as List;
List<Movie> loadedMovies = [];
for (int i = 0; i < moviesList.length; i++) {
String movieTitle = moviesList[i]['original_title'] ?? '';
String? movieImage =
'https://image.tmdb.org/t/p/w400${moviesList[i]['poster_path']}'; //results[0].poster_path
String movieDescription =
moviesList[i]['overview'] ?? ''; //results[0].overview
String movieReleaseDate = moviesList[i]['release_date'] ?? '';
String? movieRate = moviesList[i]['vote_average'].toString();
String? movieId = moviesList[i]['id'].toString();
movieTitles.add(movieTitle);
movieImageUrls.add(movieImage);
movieDescriptions.add(movieDescription);
movieReleaseDates.add(movieReleaseDate);
movieRates.add(movieRate);
movieIds.add(movieId);
loadedMovies.add(
Movie(
id: movieIds[i],
title: movieTitles[i],
imageUrl: movieImageUrls[i],
description: movieDescriptions[i],
rate: double.parse(movieRates[i]),
releaseDate: movieReleaseDates[i],
),
);
}
_movies = loadedMovies;
notifyListeners();
//print(_movies.last.title); //This prints the name of the last movie perfectly....This gets called unlimited times whenever I set the listen of the **moviesData** to true
} catch (error) {
print(error);
}
}

这里有一些东西需要打开包装。

  1. 我认为,当您调用notifyListeners调用时,应该使用Consumer小部件来侦听Movies提供的服务,而不是ChangeNotificationProvider,所以将其设为Consumer<Movie>

  2. 为了通过FutureBuilder进行异步调用,您仍然可以使用上面的Provider.of来调用它,但我相信,因为您没有从getTrendingMovies返回任何内容,只是一个Future<void>,并且您正在查询snapshot.hasData,所以快照中没有数据。也许您应该调用snapshot.connectionState == ConnectionState.done,而不是查询它是否有数据。

  3. 请确保response.body确实返回了JSON值,但我认为您的问题在于上面的一点。

最新更新