如何在 EventChannel.listen 的回调 onEvent 中显示 SnackBar

Posted

技术标签:

【中文标题】如何在 EventChannel.listen 的回调 onEvent 中显示 SnackBar【英文标题】:How to show a SnackBar in callback onEvent of EventChannel.listen 【发布时间】:2019-02-17 20:34:12 【问题描述】:

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

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

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

代码是这样的:

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

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

【问题讨论】:

【参考方案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'),
      ),
    );
  

【讨论】:

以上是关于如何在 EventChannel.listen 的回调 onEvent 中显示 SnackBar的主要内容,如果未能解决你的问题,请参考以下文章

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在QGIS中如何添加天地图的WMTS

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?

如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?

如何在百度中搜索到自己的博客?

如何在不知道 sort(XS) 是如何实现的情况下调和这个问题