我有一个带有底部导航栏的 flutter 应用程序,可以在导航中保留页面状态(我使用 go_router)。很长一段时间以来,我一直在尝试在到达我最喜欢的页面后立即在该页面上获得回调。但我不能,所以这里是我想要的概述:
第 1 页(管理导航):
void _tabChanged() {
...
}
...
LazyIndexedStack(
index: _controller.index,
children: const [
Home(),
Fav(), // it should be sent the callback, linked with tabChanged()
],
),
对于页面,你必须接收回调:
const Fav({Key? key, required this.callback}) : super(key: key);
...
widget.callback() {
... here I receive the callback from tab.dart
}
我假设您希望导航栏调用
State<Fav>
的某些方法。您可以使用 GlobleKey
查找状态
import 'package:flutter/material.dart';
class MyPage extends StatelessWidget {
const MyPage({super.key});
@override
Widget build(BuildContext context) {
final key = GlobalKey();
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
MyWidget(key: key),
ElevatedButton(
onPressed: () {
(key.currentState as _MyWidgetState).change();
},
child: const Text("Change"))
],
);
}
}
class MyWidget extends StatefulWidget {
const MyWidget({super.key});
@override
State<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
int counter = 0;
void change() {
setState(() {
counter++;
});
}
@override
Widget build(BuildContext context) {
return Text("Counter: $counter");
}
}
或者你可以传入一个
Listenable
,在Fav
中订阅,并在导航栏中触发回调。
import 'package:flutter/material.dart';
class MyPage extends StatefulWidget {
const MyPage({super.key});
@override
State<MyPage> createState() => _MyPageState();
}
class _MyPageState extends State<MyPage> {
late ChangeNotifier notifier;
@override
void initState() {
super.initState();
notifier = ChangeNotifier();
}
@override
void dispose() {
notifier.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
MyWidget(notifier: notifier),
ElevatedButton(onPressed: notifier.notifyListeners, child: const Text("Change"))
],
);
}
}
class MyWidget extends StatefulWidget {
final ChangeNotifier notifier;
const MyWidget({super.key, required this.notifier});
@override
State<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
int counter = 0;
void change() {
setState(() {
counter++;
});
}
@override
void initState() {
super.initState();
widget.notifier.addListener(change);
}
@override
void dispose() {
widget.notifier.removeListener(change);
super.dispose();
}
@override
Widget build(BuildContext context) {
return Text("Counter: $counter");
}
}
但是,最佳实践是将逻辑与小部件树分开,而不是在
State
中完成所有操作
非常感谢 PurplePolyhedron,我收到了一个错误,所以这就是我最后的做法:
GlobalKey<FavState> key = GlobalKey<FavState>();
void _handleTabChanged() {
if (_tabController.index == 1) {
WidgetsBinding.instance.addPostFrameCallback((_) {
if (key.currentState != null) {
key.currentState!.test();
}
});
}
...
}
...
LazyIndexedStack(
index: _controller.index,
children: [
const Home(),
Fav(
key: key,
),
],
),
并在“收藏夹”页面中:
void test() {
setState(() {
...
});
}