在Flutter的navigator.pop()上显示SnackBar吗?

时间:2020-05-04 13:28:20

标签: flutter dart snackbar

我创建了一个简单的购物应用程序。我试图在用户将商品添加到购物车时在主主屏幕上显示小吃店。 HomeScreen具有一个ListView.builder来构建列表。此构建器的每个子级都使用Navigator.pop()定向到ItemDetailsS​​creen,后者使用Navigator.push()返回的Future thats监听弹出消息。 then()语句中使用了一个简单的Scaffold.of(context).showSnackBar()。不幸的是,这样会引发错误:

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.dart:

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

ItemDetailsS​​creen(用户将项目添加到购物车,然后弹出屏幕返回主屏幕):

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窗口小部件和Global键,但是没有运气。知道我在这里做错了吗?

0 个答案:

没有答案