Flutter: Refre sh родительский виджет на Navigation.pop - PullRequest
0 голосов
/ 30 мая 2020

У меня есть родительский виджет «BookmarkedShows» и дочерний виджет «ListOfShows». Из дочернего виджета, когда пользователь нажимает на элемент списка, открывается страница сведений. Когда пользователь удаляет шоу из закладки со страницы сведений, при нажатии кнопки «Назад» шоу не удаляется со страницы списка. ie родительский объект не обновляется. Я использую BlocBuilder.

В другом вопросе упоминаются некоторые параметры для добавления .then () в метод Navigator.pu sh (). Однако Navigator.pu sh () происходит в дочернем компоненте. Как мне принудительно обновить sh родительский BlocBuilder во время Navigation.pop ()?

Родительский «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 Ответ

0 голосов
/ 18 июня 2020

Заданный вопрос немного неясен, но я собираюсь ответить на него как можно лучше. Если вы хотите, чтобы ваш виджет мог обновляться, вам необходимо сделать его Stateful .

Сделать свой виджет BookmarkedShows Stateful:

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)
          }),
    );
  }
}

При возврате к родительскому вам может реализовать что-то вроде этого примера документов Flutter , который может помочь обновить родительский элемент при возвращении. Метод asyn c ожидает ответа от дочернего элемента (Navigator). При возврате к родительскому элементу Stateful вы можете вызвать это, как в вышеупомянутом методе asyn c:

LoadBookmarkedShows();
setState(() { });

Надеюсь, это сработает. Гудлак.

...