Flutter как обновить страницу при возврате на неё с помощью кнопки назад "←" в AppBar?
У меня несколько десятков страниц которые можно открывать в любой последовательности с сохранением истории переходов между ними. Открываю их например так Navigator.pushNamed(context, '/basket'); Все работает прекрасно, но есть страница с корзиной в которую добавляется товары и при возврате на неё с помощью кнопки назад "←" в AppBar информация не обновляется. Есть какой нибудб способо обновить состояние страницы принудительно при возвращении на неё? Насколько я понял никакого специального события или механизма не предусмотренно.
Мой AppBar глобальный, вынесен в отдельный класс
class AppBarCustom extends StatelessWidget with PreferredSizeWidget {
@override
Widget build(BuildContext context) {
return AppBar(
backgroundColor: Helper.setAppBarColor(),
actions: <Widget>[
Padding(
padding: EdgeInsets.only(right: 20.0),
child: GestureDetector(
onTap: () {
Navigator.pushNamedAndRemoveUntil(context, '/', (_) => false);
},
child: Icon(
Icons.home,
size: 26.0,
),
)),
Padding(
padding: EdgeInsets.only(right: 20.0),
child: GestureDetector(
onTap: () {
var route = ModalRoute.of(context);
if (route != null) {
if (route.settings.name != "/search")
Navigator.pushNamed(context, '/search');
}
},
child: Icon(
Icons.search,
size: 26.0,
),
)),
Padding(
padding: EdgeInsets.only(right: 20.0),
child: GestureDetector(
onTap: () {
var route = ModalRoute.of(context);
if (route != null) {
if (route.settings.name != "/contacts")
Navigator.pushNamed(context, '/contacts');
}
},
child: Icon(Icons.call),
)),
Padding(
padding: EdgeInsets.only(right: 20.0),
child: GestureDetector(
onTap: () {
var route = ModalRoute.of(context);
if (route != null) {
if (route.settings.name != "/basket")
Navigator.pushNamed(context, '/basket');
}
},
child: Icon(Icons.shopping_cart),
)),
],
);
}
@override
// TODO: implement preferredSize
Size get preferredSize => Size.fromHeight(kToolbarHeight);
}
Ответы (1 шт):
Автор решения: MiT
→ Ссылка
Думаю смысл вы поняли:
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(home: HomeScreen()));
}
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Demo'),
),
body: Center(child: Home()),
);
}
}
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RaisedButton(
onPressed: () async {
// Ловим данные для обновления
final result = await Navigator.push(
context,
MaterialPageRoute(builder: (context) => Second()),
);
print(result);
},
child: Text('Go next!'),
);
}
}
class Second extends StatelessWidget {
@override
Widget build(BuildContext context) {
var test = 'Back';
// Переопределяем кнопку назад
return WillPopScope(
onWillPop: () {
Navigator.pop(context, test);
return Future.value(false);
},
child: Scaffold(
appBar: AppBar(
title: Text('Second'),
),
body: Container()),
);
}
}