Как создать тост во флаттере?


169

Можно ли создать что-то похожее на тосты во флаттере? Просто крошечное окно уведомлений, которое не находится прямо перед лицом пользователя и не блокирует и не затухает за ним?

Ответы:


208

Вы можете получить доступ к родителю, ScaffoldStateиспользуяScaffold.of(context)

Тогда сделай что-нибудь вроде

Scaffold.of(context).showSnackBar(SnackBar(
      content: Text("Sending Message"),
    ));

Закусочные являются официальными «Тостами» из материала дизайна. См. Https://material.io/design/components/snackbars.html#usage

Вот полностью рабочий пример:

введите описание изображения здесь

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

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

class Home extends StatelessWidget {
  const Home({
    Key key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Snack bar'),
      ),

      /// We use [Builder] here to use a [context] that is a descendant of [Scaffold]
      /// or else [Scaffold.of] will return null
      body: Builder(
        builder: (context) => Center(
              child: RaisedButton(
                child: const Text('Show toast'),
                onPressed: () => _showToast(context),
              ),
            ),
      ),
    );
  }

  void _showToast(BuildContext context) {
    final scaffold = Scaffold.of(context);
    scaffold.showSnackBar(
      SnackBar(
        content: const Text('Added to favorite'),
        action: SnackBarAction(
            label: 'UNDO', onPressed: scaffold.hideCurrentSnackBar),
      ),
    );
  }
}

1
Как это должно быть обернуто внутри onPressed, например? потому что я пробовал, и ничего не появляется на экране.
Азиза

Ну, я никогда не вписываюсь в форму, и я знаю, что "официальный" не означает абсолют !! Snackbar действительно отстой для моего приложения UX, поэтому я держусь подальше от него и всегда реализую старое всплывающее всплывающее уведомление в стиле. Я чувствую, что пользователям очень легко пропустить уведомления Snackbar (особенно, если они к этому не привыкли); но это не легко пропустить всплывающее окно, плавающее в середине, верхней или нижней части экрана.
SilSur

@aziza обернет вас виджетом кнопки в Builder (), он будет работать
Tabrizapps

У вызывающего виджета showSnackBar()должен быть Scaffoldродитель.
Лахиру Чандима

80

Используйте этот плагин

Fluttertoast.showToast(
        msg: "This is Toast messaget",
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.CENTER,
        timeInSecForIos: 1
    );

введите описание изображения здесь


2
Сначала необходимо добавить зависимость Fluttertoast в файл pubspec.yaml. Ссылка на зависимость находится здесь [link] ( pub.dartlang.org/packages/fluttertoast ). Тогда вы можете использовать приведенный выше код
fritz-playmaker

Unhandled Exception: MissingPluginException(No implementation found for method showToast on channel PonnamKarthik/fluttertoast)
Робин

1
Теперь это работает, мне нужно остановить приложение и запустить 🏃‍♂️ без отладки :)
Робин

Кто-нибудь сталкивался с проблемой, что круглая граница отключена после установки bg color github.com/PonnamKarthik/FlutterToast/issues/156
thanhbinh84

73

SnackBar безусловно, правильный класс для использования, как указал Darky.

Снэк-бар

Одна хитрость showSnackBarв том, чтобы добраться до ScaffoldState, если вы пытаетесь вызвать showSnackBarвнутри метода сборки, где вы строите свой Scaffold.

Вы можете увидеть такую ​​ошибку, которая содержит текст, объясняющий, как решить проблему.

══╡ EXCEPTION CAUGHT BY GESTURE ╞═══════════════════════════════════════════════════════════════════
The following assertion was thrown while handling a gesture:
Scaffold.of() called with a context that does not contain a Scaffold.
No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of(). This
usually happens when the context provided is from the same StatefulWidget as that whose build
function actually creates the Scaffold widget being sought.
There are several ways to avoid this problem. The simplest is to use a Builder to get a context that
is "under" the Scaffold. For an example of this, please see the documentation for Scaffold.of():
  https://docs.flutter.io/flutter/material/Scaffold/of.html
A more efficient solution is to split your build function into several widgets. This introduces a
new context from which you can obtain the Scaffold. In this solution, you would have an outer widget
that creates the Scaffold populated by instances of your new inner widgets, and then in these inner
widgets you would use Scaffold.of().
A less elegant but more expedient solution is assign a GlobalKey to the Scaffold, then use the
key.currentState property to obtain the ScaffoldState rather than using the Scaffold.of() function.
The context used was:
  MyHomePage
When the exception was thrown, this was the stack:
#0      Scaffold.of (package:flutter/src/material/scaffold.dart:444:5)
#1      MyHomePage.build.<anonymous closure> (/Users/jackson/Library/Developer/CoreSimulator/Devices/7072C907-DBAD-44FE-8F40-0257442C51D9/data/Containers/Data/Application/77FEC1A4-1453-442C-8208-96E0323DEFB2/tmp/so_scratch2Tkq9Jb/so_scratch2/lib/main.dart:23:24)
#2      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:323:14)
#3      _InkResponseState.build.<anonymous closure> (package:flutter/src/material/ink_well.dart:375:30)
#4      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:102:24)
#5      TapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:149:9)
#6      TapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:119:7)
#7      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
#8      BindingBase&SchedulerBinding&GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:147:20)
#9      BindingBase&SchedulerBinding&GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:121:22)
#10     BindingBase&SchedulerBinding&GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:101:7)
#11     BindingBase&SchedulerBinding&GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:64:7)
#12     BindingBase&SchedulerBinding&GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:48:7)
#13     _invoke1 (file:///b/build/slave/Mac_Engine/build/src/flutter/lib/ui/hooks.dart:100)
#14     _dispatchPointerDataPacket (file:///b/build/slave/Mac_Engine/build/src/flutter/lib/ui/hooks.dart:58)
Handler: onTap
Recognizer:
  TapGestureRecognizer#69dbc(debugOwner: GestureDetector, state: ready)
════════════════════════════════════════════════════════════════════════════════════════════════════

Вы можете передать GlobalKeyсвой Scaffoldконструктор:

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final key = new GlobalKey<ScaffoldState>();
    return new Scaffold(
      key: key,
      floatingActionButton: new Builder(
        builder: (BuildContext context) {
          return new FloatingActionButton(
            onPressed: () {
              key.currentState.showSnackBar(new SnackBar(
                content: new Text("Sending Message"),
              ));
            },
            tooltip: 'Increment',
            child: new Icon(Icons.add),
          );
        }
      ),
    );
  }
}

Или вы можете использовать, Builderчтобы создать BuildContextдочерний элемент скаффолда.

class MyHomePage extends StatelessWidget {
  @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("Sending Message"),
              ));
            },
            tooltip: 'Increment',
            child: new Icon(Icons.add),
          );
        }
      ),
    );
  }
}

Наконец, вы можете разделить ваш виджет на несколько классов, что является лучшим долгосрочным подходом.


Попробовал GlobalKey, теперь я получаю это исключение: I/flutter ( 4965): The following assertion was thrown while handling a gesture: I/flutter ( 4965): type 'LabeledGlobalKey<ScaffoldState>' is not a subtype of type 'BuildContext' of 'context' where I/flutter ( 4965): LabeledGlobalKey is from package:flutter/src/widgets/framework.dart I/flutter ( 4965): ScaffoldState is from package:flutter/src/material/scaffold.dart I/flutter ( 4965): Scaffold is from package:flutter/src/material/scaffold.dart I/flutter ( 4965): BuildContext is from package:flutter/src/widgets/framework.dart
Shajeel Afzal

1
Похоже, вы используете GlobalKeyв качестве аргумента, где BuildContextожидается. Я не могу помочь вам отладить это дальше, не видя больше вашего кода. Пожалуйста, опубликуйте строку кода, которая вызывает исключение, возможно, вы просто не используете правильные аргументы.
Коллин Джексон

2
Я могу подтвердить, что использование предоставленной Builderвами опции хорошо работает. Столкнулся с этой проблемой, и это решило ее для меня.
SeaFuzz

Я получил ошибку в методе GlobalKey, но исправление объявления final key = new GlobalKey<ScaffoldState>();вне сборки Widget было исправлено.
Сагар V

Один из лучших ответов в StackOverflow! Спасибо @CollinJackson
Masterfego

13

чтобы показать тост сообщение, вы можете использовать плагин flutterToast, чтобы использовать этот плагин, вы должны

  1. Добавьте эту зависимость в ваш файл pubspec.yaml: - fluttertoast: ^3.1.0
  2. чтобы получить пакет, вы должны запустить эту команду: - $ flutter packages get
  3. импортировать пакет: - import 'package:fluttertoast/fluttertoast.dart';

используйте это так

Fluttertoast.showToast(
        msg: "your message",
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.BOTTOM // also possible "TOP" and "CENTER"
        backgroundColor: "#e74c3c",
        textColor: '#ffffff');

Для получения дополнительной информации проверьте это


24
Вместо того, чтобы отвечать на тот же ответ, опубликованный кем-то другим, вы могли бы проголосовать за его ответ.
CopsOnRoad

7

трепетание: ^ 3.1.3

import 'package:fluttertoast/fluttertoast.dart';

Fluttertoast.showToast(
        msg: "This is Center Short Toast",
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.CENTER,
        timeInSecForIos: 1,
        backgroundColor: Colors.red,
        textColor: Colors.white,
        fontSize: 16.0
    );

Пожалуйста, попробуйте добавить одно или два описательных предложения, которые описывают, куда и какой код ставить. Что-то вроде «Добавить пакет в ваш pubspec» и «В коде используйте:»
mlyko

6

Я хотел бы предоставить альтернативное решение для использования пакета flushbar. https://github.com/AndreHaueisen/flushbar
Как сказано в пакете: используйте этот пакет, если вам нужно больше настроек при уведомлении вашего пользователя. Для разработчиков Android это сделано, чтобы заменить тосты и закусочные.
Еще одно предложение использовать флешбар Как отобразить снэкбар после navigator.pop (context) в Flutter?
Вы также можете установить flushbarPosition для TOP или BOTTOM
введите описание изображения здесь

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

5

Импортируйте библиотеку

трепетание: 3.1.3

Используйте как ниже

Fluttertoast.showToast(
msg: "Hello world",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,

);


4

В случае, если данный пакет Fluttertoast не работает ... Тогда я предлагаю вам попробовать тост .
В нем нет излишеств и церемоний.

введите описание изображения здесь

Это просто работает.

Я заметил ошибку в примере, приведенном в его Readme:

Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);

Пока метод требует контекста. Так что хорошо добавьте «контекст» следующим образом:

Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);

Есть вероятность, что это будет исправлено к тому времени, как вы проверили, хотя я уже представил PR.


Я предпочитаю этот плагин над pub.dartlang.org/packages/fluttertoastплагином. Это намного чище [лаконичнее] и проще в настройке.
SilSur

2

Есть три способа показать тост на флаттере приложения.
Я расскажу вам обо всех трех известных мне способах и выберу тот, который вы хотите использовать. Я бы порекомендовал второй.

1: использование внешнего пакета.

это первый метод, который является самым простым способом показать тост в приложении флаттера.

Прежде всего, вы должны добавить этот пакет в pubspec.yaml

flutter_just_toast:^version_here

затем импортируйте пакет в файл, где вы хотите показать тост.

'package:flutter_just_toast/flutter_just_toast.dart';

и последний шаг покажи тост.

Toast.show( message: "Your toast message", 
           duration: Delay.SHORT, 
           textColor: Colors.black);

2: используя официальный способ.

этот метод также прост, но вы должны иметь дело с ним. Я не говорю, что это сложно, это просто и чисто, я бы порекомендовал этот метод.

для этого метода все, что вам нужно сделать, это показать тост, используя приведенный ниже код.

Scaffold.of(context).showSnackBar(SnackBar(
          content: Text("Sending Message"),
        ));

но помните, что вы должны использовать контекст скаффолда.

3: используя нативный API.

Теперь этот метод больше не имеет смысла, если у вас уже есть два метода выше. Используя этот метод, вы должны написать собственный код для Android и iOS, а затем преобразовать его в плагин, и вы готовы к работе. Этот метод будет занимать ваше время, и вам придется изобретать велосипед. который уже был изобретен.



1

Добавьте flutter_just_toast к вашим зависимостям в вашем Pubspecs.yaml

зависимости:

flutter_just_toast: ^1.0.1

Следующий пакет импорта в ваш класс:

import 'package:flutter_just_toast/flutter_just_toast.dart';

Реализация тоста с сообщением

Toast.show( message: "Your toast message", 
    duration: Delay.SHORT, 
    textColor: Colors.black);


1

Для этого есть разные версии.

1) Прежде всего, вы можете использовать SnackBar, который является виджетом во Flutter.

2) Вы можете использовать библиотеки, такие как toast, flutter_toast из pub.dev.

3) Третья версия создает ваш собственный виджет. Его можно создать с помощью виджета «Наложение» и «Анимация во флаттере».

Вы можете это руководство, чтобы узнать больше об этом. Вот ссылка



0

https://pub.dev/packages/toast использовать это для тоста, эта библиотека довольно проста в использовании и отлично работает для iOS и Android,

Синтаксис для шоу Тост:

Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity:  Toast.BOTTOM);

0

Шаг 1:

зависимости:

flutter_just_toast: ^1.0.1

Шаг 2:

import 'package:flutter_just_toast/flutter_just_toast.dart';

Шаг 3:

Toast.show(
message: "Your toast message",
duration: Delay.SHORT,
textColor: Colors.black);


0

используйте эту зависимость: toast: ^0.1.3 затем импортируйте зависимость toast на странице: import 'package:toast/toast.dart'; затем onTap () виджета: Toast.show("Toast plugin app", context,duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);


0

Вы можете использовать этот пакет: тост

добавьте эту строку в ваши зависимости

toast: ^0.1.5

затем используйте это так:

import 'package:toast/toast.dart';
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity:  Toast.BOTTOM);


0

Там нет виджета для тостов во флаттере, вы можете перейти к этому плагину Usecase:

Fluttertoast.showToast(
msg: "My toast messge",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,);

0

Вы можете использовать библиотеку "fluttertoast". Для этого добавьте его в файл pubspec.yaml, например:

dependencies:
  fluttertoast: ^3.1.0

Затем импортируйте эту библиотеку в файл dart, который вам нужен, и напишите свой код. Например, обратитесь к следующему коду:

import 'package:flutter/material.dart';
import 'package:fluttertoast/fluttertoast.dart';



class ToastExample extends StatefulWidget {
    @override
    _ToastExampleState createState() {
      return _ToastExampleState();
    }
  }

  class _ToastExampleState extends State {
    void showToast() {
      Fluttertoast.showToast(
          msg: 'Some text',
          toastLength: Toast.LENGTH_SHORT,
          gravity: ToastGravity.CENTER,
          timeInSecForIos: 1,
          backgroundColor: Colors.red,
          textColor: Colors.white
      );
    }

    @override
    Widget build(BuildContext context) {
      return MaterialApp(
        title: 'Toast Tutorial',
        home: Scaffold(
            appBar: AppBar(
              title: Text('Toast Tutorial'),
            ),
            body: Padding(
              padding: EdgeInsets.all(15.0),
              child: Center(
                child: RaisedButton(
                  child: Text('Press to show'),
                  onPressed: showToast,
                ),
              ),
            )
        ),
      );
    }
  }

  void main() => runApp(ToastExample());

0

Импорт cupertino_icons: ^0.1.2 и запись ниже кода

showToast(BuildContext context, String message) {
 showDialog(
context: context,
builder: (BuildContext context) {
return CupertinoAlertDialog( 
title: Text("Name of App",
          content: Text(message,
          actions: <Widget>[
            FlatButton(
              child: Text("OK"),
              onPressed: () {
                Navigator.of(context).pop();
              },
            )
          ],
        );
      });

0

Для сообщения о тосте во флаттере используйте библиотеку bot_toast . Эта библиотека предоставляет многофункциональные функции, поддержку отображения уведомлений, текста, загрузки, вложений и т. Д.

введите описание изображения здесь


0

Это довольно просто,

Нам просто нужно установить пакет тостов. Обратитесь к следующей документации: https://pub.dev/packages/fluttertoast

На вкладке установки вы получите зависимость, которую нужно вставить в файл pubspec.yaml и затем установить.

После этого просто импортируйте пакет:

импортировать «пакет: fluttertoast / fluttertoast.dart»;

Аналогично вышеприведенной строке.

И затем, используя класс FlutterToast, вы можете использовать свой fluttertoast.

Вы сделали !!!


-1

Это довольно легко показать тост сообщение в флаттер.Scaffold.of(context).showSnackBar(SnackBar( content: Text("Toast Text Here"), ));


-2

Вы можете использовать что-то вроде FlutterToast

Импортируйте библиотеку

fluttertoast: ^2.1.4

Используйте как ниже

Fluttertoast.showToast(
    msg: "Hello world",
    textColor: Colors.white,
    toastLength: Toast.LENGTH_SHORT,
    timeInSecForIos: 1,
    gravity: ToastGravity.BOTTOM,
    backgroundColor: Colors.indigo,
);

Это оно..

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.