Сохранить состояние страницы при использовании навигатора

У меня есть PageView(), отображающий четыре разных страницы, и BottomNavigationBar, используемый для перехода на эти страницы. У меня есть FloatingActionButton на первой странице, когда я использую Navigator.push(), чтобы протолкнуть второй маршрут, и Navigator.pop, чтобы вывести его, начальная страница снова перестраивается. То же самое происходит, когда я использую его и на четвертой странице. первый экран возвращается вместо того же экрана, когда я выполняю операцию на этой странице. Итак, как мне вернуться на ту же страницу, сохранив состояние этой страницы?

Я использовал миксин AutomaticKeepAliveClient, чтобы сохранить состояние страниц во время навигации по нижней панели навигации, но не смог сделать это с помощью Navigator.

Эта статья Андреа Беззито действительно охватывает некоторые ее части, но я не был уверен, что именно это я хотел. поэтому хотел искать альтернативные решения, если таковые имеются.

Спасибо.

2 ответа

Решение

То, что вы ищете, называется Provider. Вот очень простой пример использования провайдера. https://github.com/m-Skolnick/provider_example_flutter

Кстати, вот как я это делаю, используя IndexedStack()

      import 'package:flutter/material.dart';

class ExampleNavRail extends StatefulWidget {
  const ExampleNavRail({super.key});

  @override
  State<ExampleNavRail> createState() => _ExampleNavRailState();
}

class _ExampleNavRailState extends State<ExampleNavRail> {
  int _selectedIndex = 0;
  late final List<Widget> _railDestinations;

// ==========================================================================================================|
//    LIFECYCLE
// =========================|

  @override
  void initState() {
    super.initState();
    _railDestinations = [
      const MyWidget('one'),
      const MyWidget('two'),
      const MyWidget('three'),
    ];
  }

// ==========================================================================================================|
//    BUILDS
// =========================|

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        Material(
          elevation: 16,
          child: NavigationRail(
            selectedIndex: _selectedIndex,
            labelType: NavigationRailLabelType.all,
            onDestinationSelected: (int index) {
              setState(() {
                _selectedIndex = index;
              });
            },
            destinations: const [
              NavigationRailDestination(
                icon: Icon(Icons.fingerprint),
                label: Text('One'),
              ),
              NavigationRailDestination(
                icon: Icon(Icons.fingerprint),
                label: Text('Two'),
              ),
              NavigationRailDestination(
                icon: Icon(Icons.fingerprint),
                label: Text('Three'),
              ),
            ],
          ),
        ),
        Expanded(
          child: IndexedStack(
            index: _selectedIndex,
            children: _railDestinations,
          ),
        ),
      ],
    );
  }
}

class MyWidget extends StatefulWidget {
  const MyWidget(this.id, {super.key});

  final String id;

  @override
  State<MyWidget> createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  final TextEditingController _controller = TextEditingController();

  @override
  void initState() {
    super.initState();
    _controller.text = widget.id;
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: SizedBox(
        width: 320,
        child: TextField(controller: _controller),
      ),
    );
  }
}
Другие вопросы по тегам