Flutter:在 Navigation.pop 上刷新父小部件
Posted
技术标签:
【中文标题】Flutter:在 Navigation.pop 上刷新父小部件【英文标题】:Flutter: Refresh parent widget on Navigation.pop 【发布时间】:2020-09-17 17:15:58 【问题描述】:我有一个父小部件“BookmarkedShows”和子小部件“ListOfShows”。从子小部件中,当用户点击列表项时,它会打开详细信息页面。当用户从详细信息页面的书签中删除节目时,按下后退按钮时,节目不会从列表页面中删除。即父级没有刷新。我正在使用 BlocBuilder。
在其他问题中提到了一些将 .then() 添加到 Navigator.push() 方法的选项。然而 Navigator.push() 发生在子组件中。在 Navigation.pop() 期间如何强制刷新父 BlocBuilder?
父“BookmarkedShows”:
class BookmarkedShows extends StatelessWidget
@override
Widget build(BuildContext context)
return BlocProvider(
create: (context) => BookmarkShowsBloc()..add(LoadBookmarkedShows()),
child: BlocBuilder<BookmarkShowsBloc, BookmarkedShowsState>(
builder: (BuildContext context, BookmarkedShowsState state)
return ShowList("Bookmarked shows", state.shows)
),
);
子“ListOfShows”:
class ListOfShows extends StatelessWidget
final String listName;
final List<Show> shows;
const ListOfShows(this.listName, this.shows);
@override
Widget build(BuildContext context)
return Wrap(children: shows.map((show) => showItem(show, context)).toList());
InkWell showItem(Show show, BuildContext context)
return InkWell(
onTap: () async
await Navigator.of(context).push(MaterialPageRoute(
builder: (context) => showDetails(show)));
,
child: Container(
CachedNetworkImage(
imageUrl: show.portraitPoster
),
));
【问题讨论】:
【参考方案1】:所提出的问题有点不清楚,但我会尽力回答。 如果您希望您的小部件能够更新,您需要将其设为Stateful。
使您的 BookmarkedShows 小部件有状态:
class BookmarkedShows extends StatefulWidget
BookmarkedShows (Key key) : super(key: key); //Can also work without this line
@override
StatefulBookmarkedShows createState() => StatefulBookmarkedShows();
class StatefulBookmarkedShows extends State<BookmarkedShows>
@override
Widget build(BuildContext context)
return BlocProvider(
create: (context) => BookmarkShowsBloc()..add(LoadBookmarkedShows()),
child: BlocBuilder<BookmarkShowsBloc, BookmarkedShowsState>(
builder: (BuildContext context, BookmarkedShowsState state)
return ShowList("Bookmarked shows", state.shows)
),
);
在返回父级时,您可以实现类似this Flutter docs example 的内容,这可能有助于在返回时更新父级。异步方法等待子(导航器)返回的响应。
当返回 Stateful
父级时,您可以像上面提到的异步方法一样调用它:
LoadBookmarkedShows();
setState(() );
我希望它有效。祝你好运。
【讨论】:
以上是关于Flutter:在 Navigation.pop 上刷新父小部件的主要内容,如果未能解决你的问题,请参考以下文章
Flutter动画性能, 官方flutter基础动画在真机上能跑到20-30%CPU
flutter系列之:在flutter中使用导航Navigator