我编写了这段代码,以便在小部件加载后获得[SnakBar][1]
:
@override
initState(){
super.initState();
Scaffold.of(_scaffoldContext).showSnackBar(new SnackBar(
content: new Text("TGPS & SMS Permissions are required"),
));
}
但我收到了这个错误:
Scaffold.of()使用不包含脚手架的上下文调用。
我阅读了this文章,但不明白如何使用它。
答案 0 :(得分:0)
方法Scaffold.of
使用提供的context
来查找作为脚手架的父窗口小部件。如果找不到,那么您将收到上述错误。这是一个如何发生的例子,以及如何解决它。
例如,下面看起来我们树上有一个脚手架吗?但是,initState中的context
getter指向窗口小部件树中的当前位置,其中Scaffold
实际上是一个孩子
class MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState():
Scaffold.of(context);
}
Widget build(BuildContext context) {
return new MaterialApp(
home: new Scaffold(
body: new Text('foo'),
),
);
}
}
小部件树看起来像这样:
MyHomePage <- MaterialApp <- Scaffold <- Text
相反,您应该做的是创建一个作为脚手架子代的小部件。保留MyHomePageState
不变,除了删除Scaffold.of
,将body
替换为另一个有状态小部件。
class MyBodyState extends State<MyBody> {
void initState() {
super.initState();
Scaffold.of(context);
}
Widget build(BuildContext context) => ...
}
现在您的小部件树看起来像这样:
MyHomePage <- MaterialApp <- Scaffold <- MyBody <- Text
由于MyBody
小部件是Scaffold
的子级,Scaffold.of
应该能够找到Scaffold
个实例。
答案 1 :(得分:0)
最好在Scaffold
添加密钥并致电key.currentState.showSnackBar
。
现在为了处理这个小部件构建本身,你实际上需要保持一秒钟以获得所需的上下文。因此,我将_buildSnackBar
方法包含在Future.delayed
调用中,以确保在build
之前调用_buildSnackBar
方法。
所以你需要做的就是这个例子:
class SnackBarExample extends StatefulWidget {
@override
_SnackBarExampleState createState() => new _SnackBarExampleState();
}
class _SnackBarExampleState extends State<SnackBarExample> {
GlobalKey<ScaffoldState> key= new GlobalKey<ScaffoldState>();
@override
void initState() {
new Future.delayed(const Duration(seconds: 1))
.then((_)=>_buildSnackBar()
);
super.initState();
}
_buildSnackBar (){
key.currentState.showSnackBar(
new SnackBar(
content: new Text("I am your snack bar"),
)
);
}
@override
Widget build(BuildContext context) {
return new Scaffold(
key:key,
);
}
}