在启动时显示SnackBar时出错

时间:2018-04-14 20:16:40

标签: dart flutter

我编写了这段代码,以便在小部件加载后获得[SnakBar][1]

@override
initState(){
  super.initState();
        Scaffold.of(_scaffoldContext).showSnackBar(new SnackBar(
        content: new Text("TGPS & SMS Permissions are required"),
      ));
} 

但我收到了这个错误:

  

Scaffold.of()使用不包含脚手架的上下文调用。

我阅读了this文章,但不明白如何使用它。

2 个答案:

答案 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,
    );
  }
}