Сохранить состояние страницы при использовании навигатора
У меня есть 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),
),
);
}
}