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在iOS14+真机上的运行问题

flutter系列之:在flutter中使用导航Navigator

Flutter入门:在macOS中安装Flutter

Flutter:如何在 google_maps_flutter 中为标记图标设置动画?

flutter 多语言配置--中文