【问题标题】:Error getting show SnackBar AT STARTUP在启动时显示 SnackBar 时出错
【发布时间】:2018-04-14 20:16:39
【问题描述】:

我写了这段代码,在小部件加载后得到一个[SnakBar][1]

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

但是我收到了这个错误:

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

看了this的文章,不明白怎么用。

【问题讨论】:

  • 您的应用中有 Scaffold 小部件吗? Scaffold.of 查找作为 Scaffold 的父小部件。如果不存在,它将无法工作
  • @JonahWilliams 是的,我的应用中确实有一个 Scaffold 小部件

标签: dart flutter


【解决方案1】:

最好给你的Scaffold添加一个密钥并调用key.currentState.showSnackBar

现在,为了在小部件自行构建后处理此问题,您实际上需要等待一秒钟以获取所需的上下文。因此,我将 _buildSnackBar 方法封装在 Future.delayed 调用中,以确保在 _buildSnackBar 调用之前调用 build 方法。

所以你需要做的是类似于这个例子:

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

【讨论】:

    【解决方案2】:

    Scaffold.of 方法使用提供的context 来查找作为 Scaffold 的父窗口小部件。如果找不到,那么您将收到上述错误。这是一个如何发生以及如何解决它的示例。

    例如,下面看起来我们在树上有一个脚手架,对吧?但是initState中的contextgetter指向的是widget树中的当前位置,其中Scaffold其实是一个child

    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 替换为另一个 Stateful 小部件。

    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 实例。

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 2019-07-04
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 2010-12-17
      • 2018-11-25
      • 1970-01-01
      • 2016-03-27
      相关资源
      最近更新 更多