在Flutter中,如何从平台调用处理程序中显示SnackBar?

时间:2018-04-02 22:41:14

标签: flutter

Flutter中的SnackBars通常看起来很简单,但是当他们试图在Channel methodCallHandler内展示它们时,它们就不会显示出来。有谁知道为什么?

这是我的代码的精简版本(只是相关部分):

class _LoginState extends State<Login> {
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

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

    _channel.setMethodCallHandler(_handlePlatformMessages);
  }

  void _onExampleButtonPressed(BuildContext context) {
    // This correctly shows my SnackBar if I use this as an 
    // onPressed handler from a button
    _showGeneralError(); 
  }

  Future<Null> _handlePlatformMessages(MethodCall call) async {
    // ... (omitted for clarity) ...
    if (!successful) {
      _showGeneralError(); // Does not show a SnackBar :(
    }
  }

  void _showGeneralError() {
    var snackBar = new SnackBar(
        content: new Text(Strings.of(context).generalError()),
        backgroundColor: Palette.yellow
    );
    _scaffoldKey.currentState.showSnackBar(snackBar);
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      key: _scaffoldKey,
      body: /* some widgets */;
    );
  }
}

编辑:根据Remi的评论使用GlobalKey。但这并没有解决问题。

1 个答案:

答案 0 :(得分:0)

解决方法是延迟从平台代码发送消息。它必须发送得太快或者某些东西(即使代码是在扑动的一面处理的)。我通过将消息发布到Android上的主线程处理程序,将消息延迟了一帧。