繁体   English   中英

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

[英]In Flutter, how do I show a SnackBar from a platform call handler?

Flutter中的SnackBars通常看起来很简单,但是当尝试从ChannelmethodCallHandler显示时,它们不会显示。 有人知道为什么吗?

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

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。 但是,这并不能解决问题。

解决方案是将平台代码的消息发送延迟一点。 它一定是发送得太早了或什么(即使代码是在颤抖的一面处理)。 通过将消息发布到Android上的主线程处理程序,我将消息延迟了一个帧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM