【问题标题】:How to show a SnackBar in callback onEvent of EventChannel.listen如何在 EventChannel.listen 的回调 onEvent 中显示 SnackBar
【发布时间】:2023-03-21 17:26:02
【问题描述】:

使用EventChannel 从本机代码接收事件。

内容是字符串,我想用SnackBar 显示它。

但是Scaffold.of 返回空值。而且我没有发现任何东西可以得到BuildContext 的Scaffold 由Widget Build(...) 创建。

代码是这样的:

@override
void initState() {
super.initState();

showMsg.receiveBroadcastStream().listen(
    (event) => setState(() {
        Scaffold.of(context).showSnackBar(new SnackBar(
            content: new Text(event.toString()),
        ));
    }),
    onError: (event) => {}
);

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    编辑/更新答案

    随着新的 Flutter 更新,您现在必须使用 ScaffoldMessenger 来显示 SnackBar。

    ScaffoldMessenger.of(context).showSnackBar(
            SnackBar(
              content: Text('test'),
            ),
          );
    

    我使用的是低于 Flutter 的版本和频道

    1.24.0-10.1.pre • 频道开发 •

    老答案

    您需要一个 Scaffold 的密钥,您可以使用它来获取 Scaffold 的状态

    final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
    

    现在在您的build 方法中,它必须返回脚手架。 在Scaffold 中分配key: _scaffoldKey,

    return new Scaffold(
          key: _scaffoldKey,
          ...,
    );
    

    使用此key,您可以访问Scaffold 的状态。

    _scaffoldKey.currentState.showSnackBar(new SnackBar(
                content: new Text(event.toString()),
    ));
    

    【讨论】:

    • 嗨。答案对你有用吗?我收到异常,因为“方法‘showSnackBar’在 null 上被调用。”请指教。
    • @ManojArunS 不要将 _scaffoldKey 放在 StatelessWidget 中。这种状态进入 State 类。将您的小部件转换为有状态的。我一直有同样的问题,最后我意识到这就是原因。
    【解决方案2】:
    import 'package:flutter/material.dart';
    
    void main() => runApp(SnackBarExample());
    
    class SnackBarExample extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'SnackBar Example',
          home: Scaffold(
            appBar: AppBar(
              title: Text('SnackBar Example'),
            ),
            body: SnackBarPage(),
          ),
        );
      }
    }
    
    class SnackBarPage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Center(
          child: RaisedButton(
            onPressed: () {
              final snackBar = SnackBar(
                content: Text('This is a SnackBar!'),
                action: SnackBarAction(
                  label: 'Action',
                  onPressed: () {
                    // Some code to action.
                  },
                ),
              );
    
              Scaffold.of(context).showSnackBar(snackBar);
            },
            child: Text('Showing SnackBar'),
          ),
        );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-09-24
      • 2017-11-23
      • 2019-08-28
      • 2021-03-11
      • 2019-07-27
      • 1970-01-01
      • 2016-04-05
      • 2019-05-24
      • 2023-03-07
      相关资源
      最近更新 更多