Scaffold.of()被调用时传入了不包含Scaffold的上下文。
Scaffold.of()被调用时传入了不包含Scaffold的上下文。
正如您所看到的,我的按钮位于Scaffold
的主体内。但我得到了这个异常:
Scaffold.of()使用了不包含Scaffold的上下文。
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
一个key,这个key是GlobalKey
,我们可以在不需要将我们的主体包装在Builder
小部件内的情况下显示SnackBar。返回Scaffold
的小部件应该是一个有状态的小部件。
_scaffoldKey.currentState.showSnackBar(snackbar);
admin 更改状态以发布 2023年5月22日
你可以使用 GlobalKey
来实现。唯一的缺点是,使用 GlobalKey 可能不是实现此目的最有效的方式。
一个好处是,你也可以将这个 key 传递给其他不包含任何 scaffold 的自定义 widget 类。查看 (这里)
class HomePage extends StatelessWidget { final _scaffoldKey = GlobalKey(); \\ new line @override Widget build(BuildContext context) { return Scaffold( key: _scaffoldKey, \\ new line 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?')); _scaffoldKey.currentState.showSnackBar(snackBar); \\ edited line } }
出现这个异常是因为你正在使用实例化Scaffold
的小部件的context
,而不是Scaffold
的子元素的context
。
您可以通过使用不同的上下文来解决此问题:
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
,但这不是获取不同BuildContext
的唯一方法。
还可以将子树提取到不同的Widget
中(通常使用“提取小部件”重构)。