Показать SnackBar на navigator.pop () в Flutter? - PullRequest
0 голосов
/ 04 мая 2020

Я создал простое приложение для покупок. Я пытаюсь показать снек-бар на главном домашнем экране, когда пользователь добавляет товар в корзину. На HomeScreen есть ListView.builder, который создает список. Каждый дочерний элемент этого компоновщика направляется на ItemDetailsScreen с помощью Navigator.pop (), который прослушивает поп, используя Future, возвращаемый Navigator.pu sh (). Простой Scaffold.of (context) .showSnackBar () используется в операторе then (). К сожалению, возникает ошибка:

Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe. At this point the state of the widget's element tree is no longer stable.To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.

Ниже приведен код -

home_screen.dart:

Widget build(BuildContext context) {
    final mediaQuery = MediaQuery.of(context);
    final _scaffoldKey = GlobalKey<ScaffoldState>();

    return Scaffold(
      key: _scaffoldKey,
      backgroundColor: Theme.of(context).primaryColor,
      drawer: AppDrawer(),
      body: Column(
.......
               Flexible(
                 flex: 4,
                 child: Container(child: ItemList()),
               ),
)

item_list. дротик:

Widget build(BuildContext context) {
    final items = Provider.of<List<Item>>(context);

    if (items != null) {
      return ListView.builder(
        itemBuilder: (context, index) => ChangeNotifierProvider.value(
          // Value should be used in grids or lists because of the widget being destroyed and reference being empty issue
          value: items[index],
          child: ItemListTile(),
        ),
        itemCount: items.length,
      );
    } else {
      return Center(
        child: CircularProgressIndicator(),
      );
    }
  }

item_list_tile.dart:

@override
  Widget build(BuildContext context) {
    final item = Provider.of<Item>(context);
    final cart = Provider.of<Cart>(context, listen: false);

    return Padding(
      padding: EdgeInsets.only(top: 10.0),
      child: InkWell(
        onTap: () {
          Navigator.of(context)
              .push(
                MaterialPageRoute(
                  builder: (context) => ItemDetailsScreen(
                    itemId: item.id,
                    itemName: item.name,
                    itemPrice: item.price,
                    imageUrl: item.imageUrl,
                  ),
                ),
              )
              .then((_) => Scaffold.of(context)
                  .showSnackBar(SnackBar(content: Text("Item added"))));
        },

ItemDetailsScreen (где пользователь добавляет товар в корзину, и экран возвращается на go назад на домашний экран) :

Padding(
  padding: EdgeInsets.only(bottom: 5.0),
  child: InkWell(
     onTap: () {
        cart.addToCart(
           widget.itemId,
           widget.itemPrice,
           widget.itemName,
           widget.imageUrl,
           numberOfItems,
        );
  Navigator.of(context).pop();
},

Я тоже безуспешно пытался использовать виджет Builder и глобальные ключи. Есть идеи, что я тут не так делаю?

...