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

时间:2018-11-28 19:45:45

标签: dart flutter android-snackbar snackbar

SnackBar执行操作后,我试图显示AppBarAppBar无法通过构建器构建,因此Scaffold祖先无法访问。 我知道我们可以随时使用GlobalKey对象访问上下文,但是我想知道如果不使用GlobalKey,是否有解决方案。 我发现了一些github问题和pull-request,但是我找不到他们的解决方案 => https://github.com/flutter/flutter/issues/4581https://github.com/flutter/flutter/pull/9380

更多上下文: 我有一个Appbar和一个PopupMenuButton,其中有一项。当用户单击该项目时,我将显示一个使用showDialog方法的对话框,并且如果用户单击“确定”,则要显示一个SnackBar

4 个答案:

答案 0 :(得分:3)

<sslContextParameters xmlns="http://camel.apache.org/schema/blueprint" id="sslContextParameters"> <keyManagers keyPassword="{{keystore.pwd}}"> <keyStore resource="{{keystore.url}}" password="{{keystore.pwd}}"/> </keyManagers> </sslContextParameters> <bean id="customSocketFactory" class="zotix.co.util.CustomSocketFactory"> <argument ref="sslContextParameters" /> </bean> <bean id="ldapserver" class="javax.naming.directory.InitialDirContext" scope="prototype"> <argument> <props> <prop key="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/> <prop key="java.naming.provider.url" value="ldaps://lab.zotix.co:636"/> <prop key="java.naming.security.protocol" value="ssl"/> <prop key="java.naming.security.authentication" value="simple" /> <prop key="java.naming.security.principal" value="cn=Manager,dc=example,dc=com"/> <prop key="java.naming.security.credentials" value="passw0rd"/> <prop key="java.naming.ldap.factory.socket" value="zotix.co.util.CustomSocketFactory"/> </props> </argument> </bean> 参数需要一个Scaffold.appBar,因此您可以在其中拥有一个PreferredSizeWidget,如下所示:

Builder

答案 1 :(得分:0)

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

显示对话框时,将显示一个完全不同的页面/路由,这超出了呼叫页面的范围。因此没有可用的脚手架。

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

相反,如果您使用GlobalKey来获取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),
                  ),
                ),
              ];
            },
          )
        ],
      ),
    );
  }
}

答案 2 :(得分:0)

我知道您的问题与小吃店有关。
关于显示通知,我建议使用软件包flushbar https://github.com/AndreHaueisen/flushbar
另一个建议使用冲洗栏How to show snackbar after navigator.pop(context) in Flutter? enter image description here

    Flushbar(
      title: "Hey Ninja",
      message: "Lorem Ipsum is simply dummy text of the printing and typesetting industry",
      flushbarPosition: FlushbarPosition.TOP,
      flushbarStyle: FlushbarStyle.FLOATING,
      reverseAnimationCurve: Curves.decelerate,
      forwardAnimationCurve: Curves.elasticOut,
      backgroundColor: Colors.red,
      boxShadows: [BoxShadow(color: Colors.blue[800], offset: Offset(0.0, 2.0), blurRadius: 3.0)],
      backgroundGradient: LinearGradient(colors: [Colors.blueGrey, Colors.black]),
      isDismissible: false,
      duration: Duration(seconds: 4),
      icon: Icon(
        Icons.check,
        color: Colors.greenAccent,
      ),
      mainButton: FlatButton(
        onPressed: () {},
        child: Text(
          "CLAP",
          style: TextStyle(color: Colors.amber),
        ),
      ),
      showProgressIndicator: true,
      progressIndicatorBackgroundColor: Colors.blueGrey,
      titleText: Text(
        "Hello Hero",
        style: TextStyle(
            fontWeight: FontWeight.bold, fontSize: 20.0, color: Colors.yellow[600], fontFamily: "ShadowsIntoLightTwo"),
      ),
      messageText: Text(
        "You killed that giant monster in the city. Congratulations!",
        style: TextStyle(fontSize: 18.0, color: Colors.green, fontFamily: "ShadowsIntoLightTwo"),
      ),
    )..show(context);

答案 3 :(得分:0)

您可以使用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);
            },
          );
        },
      ),
    ],
  )
);