【问题标题】:How to show snackbar message on next screen in Flutter / Dart?如何在 Flutter / Dart 的下一个屏幕上显示小吃栏消息?
【发布时间】:2021-08-15 17:58:41
【问题描述】:

我的 Flutter 项目中有 2 个屏幕:

  1. 记录屏幕列表
  2. 添加记录屏幕

当记录被提交并添加到“添加记录屏幕”时,屏幕将重定向到“记录列表屏幕”,并在此屏幕上显示添加的记录工作。

我的查询是我想显示应该设置在“添加记录屏幕” 上的成功消息,并且应该在转换后显示在“记录屏幕列表” 上。我在 “添加记录屏幕” 上添加小吃吧代码:

ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text('Record has been added successfully.'),
        duration: Duration(milliseconds: 5000),
      ),
    );

重定向到“记录列表屏幕”后返回错误。我认为 “记录屏幕列表” 没有在 “添加记录屏幕” 上设置的快餐栏“上下文”,这就是我收到错误的原因。

有没有人可以帮助我了解实际错误是什么以及如何在 “记录屏幕列表” 上显示快餐栏消息,设置在 “添加记录屏幕”

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: flutter dart snackbar


    【解决方案1】:

    要在下一页上显示snackbar,您可以将snackbar 函数传递给您正在导航到的页面,然后使用该答案中提到的方法在该页面的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'),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: const <Widget>[
                Icon(Icons.two_k),
                SizedBox(height: 15),
                Text(
                  'Second Page',
                ),
              ],
            ),
          ),
        );
      }
    }
    

    【讨论】:

    • 感谢 Arun 的建议,如果我使用您的解决方案,那么我将不得不在整个项目的所有屏幕上采用“反馈”参数,这是一个非常漫长的过程。顺便说一句,在渲染屏幕的“构建”方法之前,我们会在 initState 函数中获得上下文吗?再次感谢。
    • 您将可以在 initState 中访问该小部件的上下文。所以,你可以在那里实现小吃店。但是您仍然必须使用 addPostFrameCallback。在构建小部件之前尝试渲染小吃栏将导致异常。此外,在此处不带任何条件地实现快餐栏将导致它在每次第一次构建页面时显示(每次调用 initState 时)。
    • 谢谢,我已经更新了下一个屏幕上的代码,我们将在其中显示小吃栏消息: if (widget.getSnackbarMessage != null) { WidgetsBinding.instance?.addPostFrameCallback((_) { widget.getSnackbarMessage? 。称呼(); }); }
    • 我的项目中有 100 多个屏幕。我是否需要在所有屏幕上设置WidgetsBinding.instance?.addPostFrameCallback( (_) { widget.feedback?.call(); }, );?或者我们有这个问题的集中解决方案吗?请分享谢谢。
    猜你喜欢
    • 2020-07-14
    • 2021-04-13
    • 2020-04-07
    • 2018-12-18
    • 1970-01-01
    • 2019-01-25
    • 2019-06-01
    • 2021-06-03
    • 2020-05-22
    相关资源
    最近更新 更多