如何在 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
返回空值。而且我没有发现任何东西可以得到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) =>
);
【问题讨论】:
【参考方案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 中开始新的活动?
如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?