Я использую многоразовый виджет AppBar с кнопками заголовка и действия.
В действиях панели приложений есть кнопка со значком избранного и кнопка со значком корзины со значком, показывающим все товары в корзине:
Виджет панели приложений:
import 'package:badges/badges.dart';
import 'package:flutter/material.dart';
class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
final BuildContext context;
final String title;
final bool showBackButton;
final Widget widget;
final bool showActions;
CustomAppBar({
@required this.context,
@required this.title,
this.showBackButton = true,
this.widget,
this.showActions = true,
});
@override
Widget build(BuildContext context) {
return AppBar(
title: Text(title),
leading: showBackButton
? new IconButton(
icon: new Icon(
Icons.arrow_back,
),
onPressed: () {
if (widget != null) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => widget,
),
);
return true;
} else {
Navigator.pop(context);
}
},
)
: null,
actions: !showActions ? null : <Widget>[
IconButton(
icon: const Icon(Icons.favorite_border),
onPressed: () {
Navigator.pushReplacement(
context,
MaterialPageRoute<void>(
builder: (BuildContext context) {
return MainHome(
selectedIndex: 1,
);
},
),
);
},
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 5),
child: Badge(
position: BadgePosition.topEnd(top: 3, end: 3),
animationDuration: Duration(milliseconds: 300),
animationType: BadgeAnimationType.slide,
badgeColor: Colors.white,
toAnimate: true,
badgeContent: Text(
'5',
style: TextStyle(
fontSize: 8,
color: Theme.of(context).primaryColor,
fontWeight: FontWeight.bold),
),
child: IconButton(
icon: const Icon(Icons.shopping_cart_rounded),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute<void>(
builder: (BuildContext context) {
return MainHome(
selectedIndex: 2,
);
},
),
);
},
),
),
),
],
);
}
@override
Size get preferredSize {
return new Size.fromHeight(kToolbarHeight);
}
}
Панель приложения используется на всех экранах, но с разными параметрами.
Я хочу обновлять счетчик на панели приложения всякий раз, когда пользователь добавляет в корзину, обновляет корзину, удаляет из корзины. Это может происходить на нескольких страницах: странице со списком товаров, странице сведений о продукте, странице корзины покупок, виджете поисковых предложений. На всех этих страницах есть действия с корзиной (добавить / обновить / удалить).
Я не хочу управлять этим счетчиком на каждой странице. Мне нужен способ управлять им в одном месте и получать уведомления при каждом обновлении корзины, чтобы обновить значок
Я много искал. Некоторые используют GLobalKey для управления состоянием, но в моем случае это не работает, поскольку виджет панели приложений не имеет состояния.