【问题标题】:Flutter: Refresh parent widget on Navigation.popFlutter:在 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
              ),
        ));
  }
}

【问题讨论】:

    标签: flutter bloc flutter-navigation


    【解决方案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(() { });
    

    我希望它有效。祝你好运。

    【讨论】:

      猜你喜欢
      • 2020-11-28
      • 1970-01-01
      • 2021-08-04
      • 2019-10-19
      • 2018-12-29
      • 2020-07-25
      • 2018-09-26
      • 2023-01-05
      • 2021-10-10
      相关资源
      最近更新 更多