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()),
    );
  }
}
→ Ссылка