Flutter: как отобразить снэк-бар из действия панели приложений - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь отобразить SnackBar после выполнения действия с AppBar.AppBar не может быть построен из строителя, поэтому он не может получить доступ, является предком скаффолда.Я знаю, что мы можем использовать объект GlobalKey для доступа к контексту, когда захотим, но я хотел бы знать, есть ли решение без использования GlobalKey.Я нашел некоторые проблемы с github и pull-request, но я не могу найти решение по ним => https://github.com/flutter/flutter/issues/4581 и https://github.com/flutter/flutter/pull/9380

Еще немного контекста: у меня есть Appbar сPopupMenuButton, которые имеют один предмет.Когда пользователь нажимает на этот элемент, я отображаю диалоговое окно, в котором используется метод showDialog, и если пользователь нажимает кнопку «ОК», я хочу отобразить SnackBar

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Для параметра Scaffold.appBar требуется PreferredSizeWidget, поэтому вы можете иметь Builder там вот так:

appBar: PreferredSize(
  preferredSize: Size.fromHeight(56),
  child: Builder(
    builder: (context) => AppBar(...),
  ),
),
0 голосов
/ 28 мая 2019

Я знаю, что ваш вопрос о закусочной.
Об отображении уведомлений, я предлагаю использовать пакет flushbar https://github.com/AndreHaueisen/flushbar
Еще одно предложение использовать flushbar Как отобразить snackbar после navigator.pop (context) в 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);
0 голосов
/ 28 ноября 2018

Можно использовать два контекста в диалоге и использовать контекст, переданный диалогу, для поиска 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),
                  ),
                ),
              ];
            },
          )
        ],
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...