Как создать Toast в Flutter?

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

Ответ 1

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

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

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

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

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

enter image description here

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

Ответ 2

SnackBar определенно является подходящим классом для использования, как отметил Darky.

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

Или вы можете использовать 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),
          );
        }
      ),
    );
  }
}

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

Ответ 3

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

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

enter image description here

Ответ 4

чтобы показать тост сообщение, вы можете использовать плагин 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');

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

Ответ 5

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

Ответ 6

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

enter image description here

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

Я заметил ошибку в примере, приведенном в его 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.

Ответ 8

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

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

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

Ответ 9

Шаг 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);

Ответ 10

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

Ответ 11

Для тех, кто ищет Toast, который может пережить изменения маршрута, SnackBar может быть не лучшим вариантом.

Взгляните на Overlay вместо этого.

https://api.flutter.dev/flutter/widgets/Overlay-class.html

Ответ 12

Самый простой способ - добавить строку ниже в файл зависимостей

toast: ^0.1.5

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

import 'package:toast/toast.dart';

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

Ответ 13

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

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

toast: ^0.1.5

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

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

Ответ 14

Добавьте 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);

Ответ 15

получить пакет тостов трепетать здесь

Добавьте этот пакет в зависимости вашего проекта в pubspec.yaml

Затем всякий раз, когда вы хотите, чтобы тост отображался как нажатие кнопки

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

Ответ 16

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

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

Ответ 17

просто используйте SnackBar (content: Text ("hello"),) внутри любого события, например onTap и onPress

Вы можете прочитать больше о Snackbar здесь https://flutter.dev/docs/cookbook/design/snackbars

Ответ 18

Вы можете попробовать this-

OkToast: плагин флаттера

Это действительно легко реализовать. И вы можете настроить тост как угодно.

Ответ 19

Вы можете использовать что-то вроде 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,
);

Это оно..

Ответ 20

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

dependencies:
  fluttertoast: ^3.1.0

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

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