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

时间:2018-09-13 06:50:39

标签: dart flutter

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

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

但是Scaffold.of返回null。而且我什么也没能得到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) => {}
);

2 个答案:

答案 0 :(得分:2)

您将需要一个用于脚手架的钥匙,通过它您可以获取脚手架的状态

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()),
));

答案 1 :(得分:0)

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'),
      ),
    );
  }
}