Flutter:如何通过应用程序栏操作显示小吃栏

Que*_*tin 2 dart snackbar android-snackbar flutter

我尝试SnackBar从执行操作后显示a AppBar。在AppBar无法从一个生成器,它不能访问是脚手架的祖先建造。我知道我们可以随时使用GlobalKey对象访问上下文,但是我想知道是否有解决方案而不使用GlobalKey。我发现了一些github问题和请求请求,但我找不到它们的解决方案=> https://github.com/flutter/flutter/issues/4581https://github.com/flutter/flutter/拉/ 9380

其他一些情况:我有一个Appbar带有的项目PopupMenuButton,其中有一项。当用户单击该项目时,我将显示一个对话框,该对话框显示showDialog方法,如果用户单击“确定”,则要显示一个对话框。SnackBar

小智 14

您可以使用 Builder 小部件

例子:

Scaffold(
  appBar: AppBar(
    actions: <Widget>[
      Builder(
        builder: (BuildContext context) {
          return IconButton(
            icon: const Icon(Icons.message),
            onPressed: () {
              final snackBar = SnackBar(content: Text('Yay! A SnackBar!'));
              Scaffold.of(context).showSnackBar(snackBar);
            },
          );
        },
      ),
    ],
  )
);
Run Code Online (Sandbox Code Playgroud)


Dar*_*rdi 6

Scaffold.appBar参数需要一个PreferredSizeWidget,因此您可以Builder像这样:

appBar: PreferredSize(
  preferredSize: Size.fromHeight(56),
  child: Builder(
    builder: (context) => AppBar(...),
  ),
),
Run Code Online (Sandbox Code Playgroud)


che*_*ins 1

一个选项是在对话框中使用两个上下文,并使用传递给对话框的上下文来搜索Scaffold.

当您显示对话框时,您正在显示一个完全不同的页面/路线,该页面/路线超出了调用页面的范围。所以没有可用的脚手架。

下面有一个使用第一页范围的工作示例。但问题是,它SnackBar没有被删除。

如果您使用 aGlobalKey来获取Scaffold问题是相同的。

在这种情况下,我会考虑不使用 Snackbar,因为它与下面的页面相关联。它甚至被对话框阴影变灰。

import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  _showDialog(BuildContext context1) {
    return showDialog(
        context: context1,
        builder: (BuildContext context) {
          return AlertDialog(
            content: Text("Dialog"),
            actions: <Widget>[
              new FlatButton(
                child: new Text("OK"),
                onPressed: () => Scaffold.of(context1).showSnackBar(SnackBar(
                      content: Text("Pressed"),
                    )),
              ),
            ],
          );
        });
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text("Test"),
        actions: <Widget>[
          PopupMenuButton(
            itemBuilder: (BuildContext context) {
              return <PopupMenuEntry>[
                PopupMenuItem(
                  child: ListTile(
                    title: Text('Show dialog'),
                    onTap: () => _showDialog(context),
                  ),
                ),
              ];
            },
          )
        ],
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)