问题描述
我的 Flutter 项目中有 2 个屏幕:
- 记录列表屏幕
- 添加录制屏幕
在“添加记录屏幕”上提交并添加记录后,屏幕将重定向到“记录列表屏幕”,并在此屏幕上显示添加的记录,即工作。
我的查询是我想显示成功消息,该消息应设置在“添加记录屏幕” 上,并应在转换后显示在“记录屏幕列表” 上。我在 “添加记录屏幕” 上添加快餐栏代码:
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text('Record has been added successfully.'),duration: Duration(milliseconds: 5000),),);
重定向到“记录列表屏幕”后返回错误。我认为“记录屏幕列表”没有在“添加记录屏幕”上设置的快餐栏“上下文”,这就是我收到错误的原因。
有没有人可以帮助我了解实际错误是什么以及如何在“记录列表屏幕”上显示小吃栏消息,设置为“添加记录屏幕”?
任何帮助将不胜感激。谢谢。
解决方法
要在下一页显示小吃店,您可以将小吃店功能传递给您要导航到的页面,然后在该页面的 initState 中调用它,使用此答案中提到的方法:https://stackoverflow.com/a/50682918/16045128
WidgetsBinding.instance?.addPostFrameCallback((_) { widget.feedback?.call(); });
反馈小吃店演示:
class Home extends StatefulWidget {
const Home({Key? key}) : super(key: key);
@override
State<Home> createState() => _HomeState();
}
class _HomeState extends State<Home> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,title: const Text('Home Page'),),body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,children: const <Widget>[
Icon(Icons.home),SizedBox(height: 15),Text(
'Home Page',],floatingActionButton: Row(
mainAxisAlignment: MainAxisAlignment.end,children: [
Tooltip(
message: "Show Snackbar",child: ElevatedButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => SecondPage(
feedback: () {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('You have reached the second page.'),duration: Duration(seconds: 3),);
},);
},child: const Icon(Icons.check),const SizedBox(width: 15),Tooltip(
message: "Don't Show Snackbar",child: ElevatedButton(
onPressed: () {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => const SecondPage(),child: const Icon(Icons.close),);
}
}
class SecondPage extends StatefulWidget {
const SecondPage({Key? key,this.feedback}) : super(key: key);
final Function? feedback;
@override
_SecondPageState createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> {
@override
void initState() {
super.initState();
WidgetsBinding.instance?.addPostFrameCallback(
(_) {
widget.feedback?.call();
},);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,title: const Text('Second Page'),children: const <Widget>[
Icon(Icons.two_k),Text(
'Second Page',);
}
}