我创建了一个简单的购物应用程序。我试图在用户将商品添加到购物车时在主主屏幕上显示小吃店。 HomeScreen具有一个ListView.builder来构建列表。此构建器的每个子级都使用Navigator.pop()定向到ItemDetailsScreen,后者使用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"))));
},
ItemDetailsScreen(用户将项目添加到购物车,然后弹出屏幕返回主屏幕):
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键,但是没有运气。知道我在这里做错了吗?