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。但这并没有解决问题。
答案 0 :(得分:0)
解决方法是延迟从平台代码发送消息。它必须发送得太快或者某些东西(即使代码是在扑动的一面处理的)。我通过将消息发布到Android上的主线程处理程序,将消息延迟了一帧。