为什么我的AsyncMemorizer在Flutter中不能正常工作,我想停止不必要地重建我的小部件
我正在开发一个应用程序,比如livetv,它基本上是一个基于视频的推荐平台 我注意到,当我在我的应用程序的“主页”中滚动时,有状态的小部件被一次又一次地调用(因为我使用的是Future builder),正因为如此,它导致了巨大的数据消耗,这是一个严重的问题,我希望它不会发生 根据本文,我使用了记忆的概念。代码不会抛出错误。但使用后我的主页没有加载。我不明白为什么会发生这种情况 以下是我未来的构建器代码:为什么我的AsyncMemorizer在Flutter中不能正常工作,我想停止不必要地重建我的小部件,flutter,dart,async-await,Flutter,Dart,Async Await,我正在开发一个应用程序,比如livetv,它基本上是一个基于视频的推荐平台 我注意到,当我在我的应用程序的“主页”中滚动时,有状态的小部件被一次又一次地调用(因为我使用的是Future builder),正因为如此,它导致了巨大的数据消耗,这是一个严重的问题,我希望它不会发生 根据本文,我使用了记忆的概念。代码不会抛出错误。但使用后我的主页没有加载。我不明白为什么会发生这种情况 以下是我未来的构建器代码: @override Widget build(BuildContext context
@override
Widget build(BuildContext context) {
print("Build function called......................");
body: SafeArea(
child: SingleChildScrollView(
controller: _scrollController,
child: FutureBuilder(
future: widgetLoadingFunctions(_selectedIndex),
builder:
(BuildContext context, AsyncSnapshot<String> snapshot) {
if (snapshot.hasData) {
return widgetOptions(_selectedIndex);
} else
return //Asset.image('assets/loading.gif');
Image.asset('assets/loading.gif');
})),
),
drawer: Drawer(),
bottomNavigationBar: BottomNavigationBar(
backgroundColor: Colors.black,
showUnselectedLabels: true,
type: BottomNavigationBarType.shifting,
currentIndex: _selectedIndex,
fixedColor: Colors.amber,
onTap: (int index) {
setState(() {
_selectedIndex = index;
});
},
items: <BottomNavigationBarItem>[
// Icon(
// FontAwesome.facebook_square,
// color: Colors.amber,
// ),
BottomNavigationBarItem(
backgroundColor: Colors.black,
icon: Icon(Icons.home),
title: Text('Home'),
),
BottomNavigationBarItem(
backgroundColor: Colors.black,
icon: Icon(
MaterialCommunityIcons.video_vintage,
),
title: Text(
'Movies',
),
),
BottomNavigationBarItem(
backgroundColor: Colors.black,
icon: Icon(Icons.live_tv),
title: Text(
'Tv shows',
),
),
BottomNavigationBarItem(
backgroundColor: Colors.black,
icon: Icon(Icons.music_video),
title: Text(
'Music',
),
),
BottomNavigationBarItem(
backgroundColor: Colors.black,
icon: Icon(Icons.radio),
title: Text(
'News',
),
),
BottomNavigationBarItem(
backgroundColor: Colors.black,
icon: Icon(
FontAwesome.heartbeat,
),
title: Text(
'LifeStyle',
),
),
BottomNavigationBarItem(
backgroundColor: Colors.black,
icon: Icon(
Ionicons.md_football,
),
title: Text(
'Sports',
),
),
],
),
);
因此,基本上在未来的构建器中,将加载必要页面的相应功能,然后将其显示出来
HomePageWidget如下所示:
Widget homePageForBottomNavigator() {
return Stack(
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
_buildBody(MediaQuery.of(context).size.height * 0.35,
_homeBannerObjectthumbnailList, _homeBannerObjectMovieIdList),
HorizontalListView("Popular movies", _popularMoviesthumbNail,
_popularMoviesMovieId),
HorizontalListView(
"Popular Tv shows", _seriesData, _seriesVideoLinks),
//infinite list view to be implemented here
HorizontalGridViewOfCardsofGradientColorWithtitle(
1,
"Music",
_detailsOfMusicInHomePage.keys.toList(),
_detailsOfMusicInHomePage),
HorizontalListViewWithoutViewAll(
"_musicPlaylistThemeName,",
_playListImgUrls,
_playListNames,
_playListTotalTracks,
_playListVideoUrls),
HorizontalListViewWitCircularCards(
"Popular News channels",
_popularNewsChannelProfilePicUrl,
_popularNewsChannelNames,
_popularNewsChanneldesc,
_detailsNewsPage),
HorizontalListViewWithoutViewAllForLiveNewsChannels(
"Live News Channels",
_liveNewsChannelProfilePicUrl,
_liveNewsChannelNames,
_newsPageLiveNewsVideoUrls),
//VerticalListView(["Latest News"],false),
],
), //end of 1st Widget
Positioned(
bottom: MediaQuery.of(context).size.height * 0.01,
left: MediaQuery.of(context).size.width * 0.3,
child: returnToTopButton()),
],
);
}
Widget homePageForBottomNavigator(){
返回堆栈(
儿童:[
纵队(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
_buildBody(MediaQuery.of(context).size.height*0.35,
_homeBannerObjectthumbnailList,_homeBannerObjectMovieIdList),
HorizontaListView(“流行电影”)是流行电影的缩略词,
_大众生活方式),
水平视图(
“热门电视节目”、_系列数据、_系列视频链接),
//要在此处实现的无限列表视图
带标题的渐变颜色的水平网格视图(
1.
“音乐”,
_音乐主页.keys.toList()的详细信息,
_音乐详情(主页),
水平视图不带视图全部(
“_musicPlaylistThemeName,”,
_播放图像,
_播放名称,
_播放所有曲目,
_播放视频URL),
带循环卡的水平视图(
“大众新闻频道”,
_PopularNewChannelProfilePicURL,
_大众新闻频道名称,
_大众新闻频道,
_详细信息(第页),
HorizontallListViewwithoutViewAllforLiveNewsChannel(
“实时新闻频道”,
_liveNewsChannelProfilePicUrl,
_现场新闻频道名称,
_NewsPageLiveNewsVideoURL),
//VerticalListView([“最新消息”],错误),
],
),//第一个小部件的结尾
定位(
底部:MediaQuery.of(context).size.height*0.01,
左:MediaQuery.of(context).size.width*0.3,
子项:returnToTopButton()),
],
);
}
这是因为您不正确地使用了FutureBuilder
,并且您链接的中间文章提供了一个过于复杂的解决方案,解决了由于不正确使用而导致的问题。不要相信你读到的所有东西,尤其是当它们不是官方文件时
国家:
未来必须更早获得,例如在State.initState、State.didUpdateConfig或State.didChangeDependencies期间。在构造FutureBuilder时,不能在State.build或stateWidget.build方法调用期间创建它。如果future与FutureBuilder同时创建,则每次重建FutureBuilder的父级时,异步任务都将重新启动
您必须在build
之前获得Future
,就像在initState
中一样。您现在所做的是在构建过程中获取未来
在initState
期间获取Future
,将其存储在变量中,并将其传递给FutureBuilder
未来存储未来;
@凌驾
void initState(){
super.initState();
storedFuture=widgetLoadingFunctions(_selectedIndex);
}
@凌驾
小部件构建(构建上下文){
...
正文:安全区(
子:SingleChildScrollView(
控制器:\ u滚动控制器,
孩子:未来建设者(
未来:存储未来,
这是因为您不正确地使用了FutureBuilder
,并且您链接的中间文章为一个因使用不当而导致的问题提供了一个过于复杂的解决方案。不要相信您阅读的所有内容,尤其是当它们不是官方文档时
国家:
未来必须在更早的时候获得,例如在State.initState、State.didUpdateConfig或State.didChangeDependencies期间。在构造FutureBuilder时,不能在State.build或无状态Widget.build方法调用期间创建未来。如果未来与FutureBuilder同时创建,则每次FutureBuilder如果重新生成其父级,则将重新启动异步任务
您必须在build
之前获得Future
,就像在initState
中一样。现在要做的是在build
期间获得Future
在initState
期间获取Future
,将其存储在变量中,并将其传递给FutureBuilder
未来存储未来;
@凌驾
void initState(){
super.initState();
storedFuture=widgetLoadingFunctions(_selectedIndex);
}
@凌驾
小部件构建(构建上下文){
...
正文:安全区(
子:SingleChildScrollView(
控制器:\ u滚动控制器,
孩子:未来建设者(
未来:存储未来,
我已经在@override Widget Build(BuildContext上下文)下包含了语句print(“名为………..的构建函数”){,一次又一次地被打印出来,尽管现在我向下滚动时它看起来更容易控制。@ChethanVenkataramaiah您无法控制何时调用生成。甚至不要尝试。但是,我在回答中显示的内容将停止重复使用数据。这不是停止生成的解决方案。当然,我会标记为已接受。唯一的问题是我不明白您为什么这么做寿
class _LiveTvHomePageState extends State<LiveTvHomePage> {
final AsyncMemoizer _memoizer = AsyncMemoizer();
Future<String> functionsToBeLoadedForHomePage() async {
String url =
"https://livetvapi.apyhi.com/api/v3/home?pageLocation=home&countries=IN&app_version=13&"
"user_id=44edc2c905ae163f&package_id=livetv.movies.freemovies.watchtv.tvshows&os_platform=android";
var res = await http
.get(url, headers: {'Authorization': dartJsonWebTokenGenerator()});
var _playListImgUrlsObjects = [];
List<String> _thumbNailList = [];
List<String> _titleNames = [];
List<String> _subtitleNames = [];
List<String> _noOfSongs = [];
List<String> _playListVideoLinks = [];
if (res.statusCode == 200) {
final _homePage = homePageFromJson(res.body);
for (var homeBannerObject in _homePage.homeBanners) {
for (var obj in homeBannerObject.thumbnail) {
_homeBannerObjectthumbnailList.add(obj.toString());
}
_homeBannerObjectMovieIdList.add(homeBannerObject.movieId.substring(8));
}
for (var homeBannerObject in _homePage.movies) {
for (var obj in homeBannerObject.thumbnail) {
_popularMoviesthumbNail.add(obj.toString());
}
_popularMoviesMovieId.add(homeBannerObject.movieId.substring(8));
}
for (var homeBannerObject in _homePage.series) {
for (var obj in homeBannerObject.thumbnail) {
_seriesData.add(obj.toString());
_seriesVideoLinks.add(homeBannerObject.posterLink.substring(23, 34) +
"&list=" +
homeBannerObject.seriesId.substring(8));
}
}
for (var everyObj in _homePage.musicCategories) {
for (var playlistsObj in everyObj.playlists) {
_titleNames.add(playlistsObj.playlistName);
_subtitleNames.add(playlistsObj.playlistDescription.substring(
0,
playlistsObj.playlistDescription.length <= 20
? playlistsObj.playlistDescription.length
: 20) +
"...");
_noOfSongs.add(playlistsObj.playlistTotalTracks.toString());
_playListVideoLinks.add(playlistsObj.playlistUrl);
for (var playlistImagesObj in playlistsObj.playlistImages) {
_thumbNailList.add(playlistImagesObj.url);
}
}
_detailsOfMusicInHomePage[everyObj.categoryName] = [
_thumbNailList,
_titleNames,
_subtitleNames,
_noOfSongs,
_playListVideoLinks
];
_thumbNailList = [];
_titleNames = [];
_subtitleNames = [];
_noOfSongs = [];
_playListVideoLinks = [];
}
for (var playListObj in _homePage.musicPlaylists.playlists) {
_musicCategories.add(playListObj.playlistName);
}
for (var publisherObj in _homePage.publishers) {
_popularNewsChannelNames.add(publisherObj.fullName);
_popularNewsChannelProfilePicUrl.add(publisherObj.profilePicUrl);
_popularNewsChanneldesc.add(publisherObj.content.description);
}
for (var liveChannelObj in _homePage.liveChannels) {
_liveNewsChannelProfilePicUrl.add(liveChannelObj.publisherProfilePic);
_liveNewsChannelNames.add(liveChannelObj.publisherName);
}
for (var playlistsObj in _homePage.musicPlaylists.playlists) {
_playListNames.add(playlistsObj.playlistName);
_playListTotalTracks.add(playlistsObj.playlistTotalTracks.toString());
_playListImgUrlsObjects.add(playlistsObj.playlistImages);
_playListVideoUrls.add(playlistsObj.playlistUrl);
}
for (var listObj in _playListImgUrlsObjects) {
for (var obj in listObj) {
_playListImgUrls.add(obj.url.toString());
}
}
_musicPlaylistThemeName = _homePage.musicPlaylists.categoryName;
return "Successfully Exectued";
} else
return null;
}
Widget widgetOptions(int idx) {
Widget _selectedWidget = CircularProgressIndicator();
switch (idx) {
case 0:
_selectedWidget = homePageForBottomNavigator();
break;
case 1:
_selectedWidget = MoviesPageForBottomNavigator();
break;
case 2:
_selectedWidget = TvSHowsPageOfBottomNavigator();
break;
case 3:
_selectedWidget = MusicPageofBottomNavigator();
break;
case 4:
_selectedWidget = NewsPageOfBottomNavigator();
break;
case 5:
_selectedWidget = LifeStylePageOfBottomNavigator();
break;
case 6:
_selectedWidget = SportsPageOfBottomNavigator();
}
return _selectedWidget;
}
Widget homePageForBottomNavigator() {
return Stack(
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
_buildBody(MediaQuery.of(context).size.height * 0.35,
_homeBannerObjectthumbnailList, _homeBannerObjectMovieIdList),
HorizontalListView("Popular movies", _popularMoviesthumbNail,
_popularMoviesMovieId),
HorizontalListView(
"Popular Tv shows", _seriesData, _seriesVideoLinks),
//infinite list view to be implemented here
HorizontalGridViewOfCardsofGradientColorWithtitle(
1,
"Music",
_detailsOfMusicInHomePage.keys.toList(),
_detailsOfMusicInHomePage),
HorizontalListViewWithoutViewAll(
"_musicPlaylistThemeName,",
_playListImgUrls,
_playListNames,
_playListTotalTracks,
_playListVideoUrls),
HorizontalListViewWitCircularCards(
"Popular News channels",
_popularNewsChannelProfilePicUrl,
_popularNewsChannelNames,
_popularNewsChanneldesc,
_detailsNewsPage),
HorizontalListViewWithoutViewAllForLiveNewsChannels(
"Live News Channels",
_liveNewsChannelProfilePicUrl,
_liveNewsChannelNames,
_newsPageLiveNewsVideoUrls),
//VerticalListView(["Latest News"],false),
],
), //end of 1st Widget
Positioned(
bottom: MediaQuery.of(context).size.height * 0.01,
left: MediaQuery.of(context).size.width * 0.3,
child: returnToTopButton()),
],
);
}