Як створити тост у Flutter?


167

Чи можу я створити щось подібне на Toasts in Flutter? Просто крихітне вікно сповіщень, яке не знаходиться прямо перед обличчям користувача і не блокує або не згасає погляд за ним?

Відповіді:


205

Ви можете отримати доступ до батьків 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
Як це можна, наприклад, загорнути в onPress? тому що я спробував це, і на екрані нічого не з’являється.
азіза

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

@aziza wrap you button widget in 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. Посилання на залежність знаходиться тут [посилання] ( pub.dartlang.org/packages/fluttertoast ). Тоді ви можете скористатися вищевказаним кодом
фріц-плеймейкер

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

1
Тепер це працює, мені потрібно зупинити додаток і запустити 🏃‍♂️ без налагодження :)
Робін

Хтось стикався з тим, що кругла межа обмежена
thanhbinh84

73

SnackBar це, безумовно, правильний клас для використання, на що вказував Даркі.

генделик

Одна складна річ у 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),
          );
        }
      ),
    );
  }
}

Або ви можете використовувати a, 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

fluttertoast: ^ 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
    );

Будь ласка, спробуйте додати описове або два речення, де описується, куди поставити код. Щось на кшталт "Додати пакет у свою рекламу" та "В коді, використовуй:"
mlyko

6

Я хотів би запропонувати альтернативне рішення використовувати флешбар пакету. https://github.com/AndreHaueisen/flushbar
Як зазначено в пакеті: Використовуйте цей пакет, якщо вам потрібно більше налаштувань під час сповіщення свого користувача. Для розробників Android він створений для заміни тостів і закусочних.
Ще одна пропозиція використовувати флешбар Як відобразити закусочну після навігатора.pop (контексту) у 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

Імпортуйте кришку

fluttertoast: 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

Існує три способи показати тост на Flutter App.
Я розповім вам про всі три способи, які я знаю, і виберу, який саме ви хочете використовувати. Я рекомендував би другий.

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) Ви можете використовувати бібліотеки, як тост, flutter_toast від pub.dev.

3) Третя версія - це створення власного віджету. Його можна створити за допомогою віджету Overlay та Animation in Flutter.

Ви можете використовувати цей підручник, щоб дізнатися більше про нього. Ось посилання



0

https://pub.dev/packages/toast використовувати це для тостів ця бібліотека досить проста у використанні та ідеальна робота для ios та android,

Синтаксис шоу Toast:

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 тоді імпортуйте залежність тосту на сторінку: 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

Показати тост-повідомлення на Flutter досить легко.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.