Я создал простое приложение для покупок. Я пытаюсь показать снек-бар на главном домашнем экране, когда пользователь добавляет товар в корзину. На 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 и глобальные ключи. Есть идеи, что я тут не так делаю?