【问题标题】:Show snackbar from scaffold inside onPressed callback on Floating Action Button在浮动操作按钮上的 onPressed 回调中显示来自脚手架的小吃栏
【发布时间】:2018-10-28 10:14:16
【问题描述】:

我正在打电话

Scaffold.of(context).showSnackBar(SnackBar(
  content: Text("Snack text"),
));

在脚手架的floatingActionButtononPressed 内。

我收到此错误

I/flutter (18613): Scaffold.of() called with a context that does not contain a Scaffold.
I/flutter (18613): No Scaffold ancestor could be found starting from the context that was passed to 
....

当您在正文中调用Scaffold.of(context) 时,它指向了一个解决方案。

https://docs.flutter.io/flutter/material/Scaffold/of.html

但是如果你在 FloatingActionButton 的 onPressed 中调用它,同样的解决方案就不起作用

【问题讨论】:

  • 添加定义了scaffold和FloatingActionButton的Widget的代码。
  • 请贴出完整代码以便更好理解

标签: flutter


【解决方案1】:

更新:第二个解决方案比这个解决方案更好。

您应该将 floatingActionButton 小部件放在 Builder 小部件中。 以下代码应该可以工作:

@override
  Widget build(BuildContext context) {
    return new Scaffold(
      floatingActionButton: new Builder(builder: (BuildContext context) {
        return new FloatingActionButton(onPressed: () {
          Scaffold
              .of(context)
              .showSnackBar(new SnackBar(content: new Text('Hello!')));
        });
      }),
      body: new Container(
        padding: new EdgeInsets.all(32.0),
        child: new Column(
          children: <Widget>[
            new MySwitch(
              value: _switchValue,
              onChanged: (bool value) {
                if (value != _switchValue) {
                  setState(() {
                    _switchValue = value;
                  });
                }
              },
            )
          ],
        ),
      ),
    );

【讨论】:

  • 我会试试你的代码。我自己尝试了Builder,但没有用。让我再试一次
  • 这个答案比较靠谱。至少对于初学者和根据颤振文档
  • 对我也不起作用。我认为使用 Scaffold.key 的解决方案更可靠、更容易。它避免了传递上下文变量...
  • 我认为你们都是对的,Vinoth Kumar 和 CodeChimp 的解决方案比我的要好。
【解决方案2】:

添加 Scaffold 状态的 Globalkey 并使用它 显示小吃店如下,

GlobalKey<ScaffoldState> scaffoldState;

Scaffold {
key: scaffoldState,
....


scaffoldState.currentState.showSnackBar(new SnackBar(content: new Text('Hello!')));

【讨论】:

  • 完美答案+1
  • 一定要初始化scaffoldState。例如scaffoldState = GlobalKey()
【解决方案3】:

这更简单。 试过了。将 FloatingActionButton 创建为一个独立的无状态小部件。 从脚手架调用这个无状态小部件。

class Abc extends StatelessWidget
{
   Widget build(BuildContext context)
   {
      return Scaffold(
         appBar:AppBar(title:Text("Long List View")),
         body:SomeOtherWidget(),
         floatingActionButton:MyFAB()  
      );
   }
}

class MyFAB extends StatelessWidget
{
    Widget build(BuildContext context)
    {
       return FloatingActionButton(
            onPressed:(){
                showSnackBarHandler(context);
            },
            child:Icon(Icons.add),
            tooltip:"Press to Add More"
       );
    }
}

void showSnackBarHandler(BuildContext context){

var snackBar = SnackBar(
    content:Text("Hello")
);

Scaffold.of(context).showSnackBar(snackBar);

}

【讨论】:

    猜你喜欢
    • 2020-02-09
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 2015-03-10
    • 2016-06-19
    • 2017-06-11
    相关资源
    最近更新 更多