如您所见,我的按钮在Scaffold的体内。但是我得到这个异常:
在不包含Scaffold的上下文中调用Scaffold.of()。
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: HomePage(), ); } } class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('SnackBar Playground'), ), body: Center( child: RaisedButton( color: Colors.pink, textColor: Colors.white, onPressed: _displaySnackBar(context), child: Text('Display SnackBar'), ), ), ); } } _displaySnackBar(BuildContext context) { final snackBar = SnackBar(content: Text('Are you talkin\' to me?')); Scaffold.of(context).showSnackBar(snackBar); }
编辑:
我找到了解决该问题的另一种方法。如果我们为Scaffold提供一个密钥,即GlobalKey,则可以如下所示显示SnackBar,而无需使用Builder小部件包装我们的主体。返回Scaffold的小部件应该是有状态的小部件:
_scaffoldKey.currentState.showSnackBar(snackbar);
发生此异常是因为您正在使用context实例化的小部件的Scaffold。不是的context孩子Scaffold。
context
Scaffold
您可以通过使用不同的上下文来解决此问题:
Scaffold( appBar: AppBar( title: Text('SnackBar Playground'), ), body: Builder( builder: (context) => Center( child: RaisedButton( color: Colors.pink, textColor: Colors.white, onPressed: () => _displaySnackBar(context), child: Text('Display SnackBar'), ), ), ), );
请注意,尽管我们在Builder这里使用,但这并不是获取different的唯一方法BuildContext。
Builder
BuildContext
也可以将子树提取到其他树中Widget(通常使用extract widget重构)
Widget
extract widget