Comment créer Toast dans Flutter?

169

Puis-je créer quelque chose de similaire à Toasts dans Flutter? Juste une petite fenêtre de notification qui n'est pas directement face à l'utilisateur et qui ne verrouille pas ou ne décolore pas la vue derrière elle?

Aziza
la source

Réponses:

208

Vous pouvez accéder au parent en ScaffoldStateutilisantScaffold.of(context)

Puis fais quelque chose comme

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

Les Snackbars sont le "Toast" officiel de la conception matérielle. Voir https://material.io/design/components/snackbars.html#usage

Voici un exemple pleinement fonctionnel:

entrez la description de l'image ici

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),
      ),
    );
  }
}
Rémi Rousselet
la source
1
Comment cela devrait-il être enveloppé dans un onPressed par exemple? parce que je l'ai essayé et que rien n'apparaît à l'écran.
aziza
Eh bien, je ne rentre jamais dans le moule et je sais que "officiel" ne veut pas dire absolu !! Le Snackbar est vraiment nul pour mon application UX, donc je reste bien à l'écart et implémente toujours l'ancienne notification de style popup flottant. Je pense qu'il est très facile pour les utilisateurs de rater les notifications de Snackbar (surtout s'ils n'y sont pas habitués); mais il n'est pas facile de rater une popup flottant au milieu, en haut ou en bas de l'écran.
SilSur
@aziza enveloppe le widget de votre bouton dans Builder (), cela fonctionnera
Tabrizapps
L'appel de widget showSnackBar()doit avoir un Scaffoldparent.
Lahiru Chandima le
80

Utilisez ce plugin

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

entrez la description de l'image ici

Raouf Rahiche
la source
2
Vous devez d'abord ajouter la dépendance Fluttertoast dans le fichier pubspec.yaml. Le lien vers la dépendance est ici [lien] ( pub.dartlang.org/packages/fluttertoast ). Ensuite, vous pouvez utiliser le code ci-dessus
fritz-playmaker
Unhandled Exception: MissingPluginException(No implementation found for method showToast on channel PonnamKarthik/fluttertoast)
Robin le
1
Maintenant, cela fonctionne, je dois arrêter l'application et exécuter 🏃‍♂️ sans débogage :)
Robin le
Tout le monde a rencontré le problème que la bordure ronde est désactivée après avoir défini la couleur bg github.com/PonnamKarthik/FlutterToast/issues/156
thanhbinh84
73

SnackBar est définitivement la bonne classe à utiliser, comme l'a souligné Darky.

snack

Une chose délicate showSnackBarest d'accéder au ScaffoldState, si vous essayez d'appeler showSnackBardans la méthode de construction où vous construisez votre Scaffold.

Vous pouvez voir une erreur comme celle-ci, qui comprend du texte expliquant comment résoudre le problème.

══╡ 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)
════════════════════════════════════════════════════════════════════════════════════════════════════

Vous pouvez soit passer a GlobalKeyà votre Scaffoldconstructeur:

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

Ou vous pouvez utiliser a Builderpour créer un BuildContextqui est un enfant de l'échafaudage.

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

Enfin, vous pouvez diviser votre widget en plusieurs classes, ce qui est la meilleure approche à long terme.

Collin Jackson
la source
Essayé GlobalKey, maintenant je reçois cette exception: 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
Il semble que vous utilisiez a GlobalKeycomme argument où a BuildContextest attendu. Je ne peux pas vous aider à déboguer cela davantage sans voir plus de votre code. Veuillez publier la ligne de code qui lève l'exception, vous n'utilisez probablement pas les bons arguments.
Collin Jackson
2
Je peux confirmer que l'utilisation de l' Builderoption que vous avez donnée fonctionne bien. Ran dans ce problème et cela l'a résolu pour moi.
SeaFuzz
J'ai eu une erreur avec la méthode GlobalKey mais prendre la déclaration en final key = new GlobalKey<ScaffoldState>();dehors de la construction du widget l'a corrigée.
Sagar V
L'une des meilleures réponses de StackOverflow! Merci @CollinJackson
Masterfego
13

pour afficher le message toast, vous pouvez utiliser le plugin flutterToast pour utiliser ce plugin, vous devez

  1. Ajoutez cette dépendance à votre fichier pubspec.yaml: - fluttertoast: ^3.1.0
  2. pour obtenir le package, vous devez exécuter cette commande: - $ flutter packages get
  3. importer le package: - import 'package:fluttertoast/fluttertoast.dart';

utilise-le comme ça

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

Pour plus d'informations, vérifiez ceci

Virendra Varma
la source
24
Au lieu de répondre à la même réponse publiée par quelqu'un d'autre, vous auriez pu voter pour sa réponse.
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
    );
fucukur
la source
Veuillez essayer d'ajouter une ou deux phrases descriptives qui décrivent où mettre quel code. Quelque chose comme "Ajouter un package à votre pubspec" et "Dans le code, utilisez:"
mlyko
6

Je voudrais fournir une solution alternative pour utiliser le package flushbar. https://github.com/AndreHaueisen/flushbar
Comme le dit le package: utilisez ce package si vous avez besoin de plus de personnalisation lors de la notification de votre utilisateur. Pour les développeurs Android, il est fait pour remplacer les toasts et les snackbars.
Une autre suggestion pour utiliser flushbar Comment afficher le snack après navigator.pop (context) dans Flutter?
Vous pouvez également définir flushbarPosition sur TOP ou BOTTOM
entrez la description de l'image ici

    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);
chunhunghan
la source
5

Importer la bibliothèque

fluttertoast: 3.1.3

Utilisez comme ci-dessous

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

);

nimal viju
la source
4

Au cas où le paquet Fluttertoast donné jusqu'à présent ne fonctionne pas ... Alors je vous suggère d'essayer toast .
Il n'a ni fioritures ni cérémonie.

entrez la description de l'image ici

Cela fonctionne juste.

J'ai remarqué un bogue dans l'exemple donné dans son Readme:

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

Alors que la méthode nécessite un contexte. Alors faites bien d'ajouter un 'contexte' comme ceci:

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

Il y a une chance que cela ait été résolu au moment où vous avez vérifié, j'ai déjà soumis un PR.

Wale
la source
Je préfère ce plugin au pub.dartlang.org/packages/fluttertoastplugin. Celui-ci est beaucoup plus propre [concis] et plus facile à personnaliser.
SilSur
2

Il existe trois façons d'afficher des toasts sur l'application Flutter.
Je vais vous parler des trois moyens que je connais et choisir celui que vous souhaitez utiliser. Je recommanderais le deuxième.

1: utilisation d'un package externe.

c'est la première méthode qui est la façon la plus simple d'afficher des toasts sur l'application Flutter.

tout d'abord, vous devez ajouter ce package dans pubspec.yaml

flutter_just_toast:^version_here

puis importez le package dans le fichier où vous souhaitez afficher le pain grillé.

'package:flutter_just_toast/flutter_just_toast.dart';

et la dernière étape montre le toast.

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

2: en utilisant la manière officielle.

cette méthode est également simple mais vous devez y faire face. Je ne dis pas que c'est difficile c'est simple et propre, je recommanderais cette méthode.

pour cette méthode, tout ce que vous avez à faire, show toast, est d'utiliser le code ci-dessous.

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

mais rappelez-vous que vous devez utiliser le contexte d'échafaudage.

3: utilisation de l'API native.

maintenant, cette méthode n'a plus de sens lorsque vous avez déjà les deux méthodes ci-dessus. en utilisant cette méthode, vous devez écrire du code natif pour Android et iOS, puis le convertir en plugin et vous êtes prêt à partir. cette méthode consommera votre temps et vous devrez réinventer la roue. qui a déjà été inventé.

Zakria Khan
la source
1

Ajoutez flutter_just_toast à vos dépendances dans votre Pubspecs.yaml

dépendances:

flutter_just_toast: ^1.0.1

Prochain package d'importation dans votre classe:

import 'package:flutter_just_toast/flutter_just_toast.dart';

Mettre en œuvre Toast avec message

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

Pour cela, il existe différentes versions.

1) Tout d'abord, vous pouvez utiliser SnackBar qui est un widget dans Flutter.

2) Vous pouvez utiliser des bibliothèques comme toast, flutter_toast de pub.dev.

3) La troisième version crée votre widget personnalisé. Il peut être créé à l'aide du widget Overlay et de l'animation dans Flutter.

Vous pouvez suivre ce didacticiel pour en savoir plus. Voici un lien

Kanan Yusubov
la source
0

https://pub.dev/packages/toast utilisez ceci pour toast cette bibliothèque est assez facile à utiliser et fonctionne parfaitement pour iOS et Android,

Syntaxe de show Toast:

Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity:  Toast.BOTTOM);
M.Bilal Murtaza
la source
0

Étape 1:

dépendances:

flutter_just_toast: ^1.0.1

Étape 2:

import 'package:flutter_just_toast/flutter_just_toast.dart';

Étape 3:

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

Alan John
la source
0

utilisez cette dépendance: toast: ^0.1.3 puis importez la dépendance de toast dans la page: import 'package:toast/toast.dart'; puis sur onTap () du widget: Toast.show("Toast plugin app", context,duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);

AMAL KG
la source
0

vous pouvez utiliser ce package: toast

ajoutez cette ligne à vos dépendances

toast: ^0.1.5

puis utilisez-le comme ceci:

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

obtenir le paquet de toast flottant ici

Ajoutez ce package à vos dépendances de projet dans pubspec.yaml

Ensuite, chaque fois que vous souhaitez que le toast soit affiché comme si vous appuyez sur un bouton

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

Il n'y a pas de widget pour toast en flutter, vous pouvez accéder à ce plugin Usecase:

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

Vous pouvez utiliser la bibliothèque "fluttertoast". Pour ce faire, ajoutez-le dans le fichier pubspec.yaml comme:

dependencies:
  fluttertoast: ^3.1.0

Ensuite, importez cette bibliothèque dans le fichier de fléchettes, vous avez besoin du pain grillé et écrivez votre code. Par exemple, reportez-vous au code suivant:

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());
sathwik
la source
0

Importez cupertino_icons: ^0.1.2 et écrivez ci-dessous le code

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();
              },
            )
          ],
        );
      });
Aamil Silawat
la source
0

Pour le message toast dans Flutter, utilisez la bibliothèque bot_toast . Cette bibliothèque fournit une prise en charge riche en fonctionnalités pour l'affichage des notifications, du texte, du chargement, des pièces jointes, etc. Toast

entrez la description de l'image ici

Dhaval Kansara
la source
0

C'est assez simple,

Nous devons juste installer le paquet Flutter toast. Reportez-vous à la documentation suivante: https://pub.dev/packages/fluttertoast

Dans l'onglet d'installation, vous obtiendrez la dépendance que vous devez coller dans le pubspec.yaml et ensuite installer.

Après cela, importez simplement le package:

import 'package: fluttertoast / fluttertoast.dart';

Similaire à la ligne ci-dessus.

Et puis en utilisant la classe FlutterToast, vous pouvez utiliser votre fluttertoast.

Vous avez terminé!!!

Prajwal Shinde
la source
-1

Il est assez facile d'afficher un message Toast dans Flutter.Scaffold.of(context).showSnackBar(SnackBar( content: Text("Toast Text Here"), ));

Qasim Ali
la source
-2

Vous pouvez utiliser quelque chose comme FlutterToast

Importer la bibliothèque

fluttertoast: ^2.1.4

Utilisez comme ci-dessous

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

C'est tout..

Développeur Android
la source