Réponses:
Vous pouvez accéder au parent en ScaffoldState
utilisantScaffold.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:
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),
),
);
}
}
showSnackBar()
doit avoir un Scaffold
parent.
Utilisez ce plugin
Fluttertoast.showToast(
msg: "This is Toast messaget",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIos: 1
);
Unhandled Exception: MissingPluginException(No implementation found for method showToast on channel PonnamKarthik/fluttertoast)
SnackBar
est définitivement la bonne classe à utiliser, comme l'a souligné Darky.
Une chose délicate showSnackBar
est d'accéder au ScaffoldState
, si vous essayez d'appeler showSnackBar
dans 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 Scaffold
constructeur:
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 Builder
pour créer un BuildContext
qui 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.
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
GlobalKey
comme argument où a BuildContext
est 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.
Builder
option que vous avez donnée fonctionne bien. Ran dans ce problème et cela l'a résolu pour moi.
final key = new GlobalKey<ScaffoldState>();
dehors de la construction du widget l'a corrigée.
pour afficher le message toast, vous pouvez utiliser le plugin flutterToast pour utiliser ce plugin, vous devez
fluttertoast: ^3.1.0
$ flutter packages get
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
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
);
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
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);
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,
);
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.
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.
pub.dartlang.org/packages/fluttertoast
plugin. Celui-ci est beaucoup plus propre [concis] et plus facile à personnaliser.
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é.
Pour ceux qui recherchent Toast
ce qui peut survivre, l'itinéraire change, SnackBar
ce n'est peut-être pas la meilleure option.
Jetez un œil à la Overlay
place.
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);
utilisez simplement SnackBar (content: Text ("bonjour"),) dans n'importe quel événement comme onTap et onPress
vous pouvez en savoir plus sur Snackbar ici https://flutter.dev/docs/cookbook/design/snackbars
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
Pour les toasts graphiques originaux Android, vous pouvez utiliser ceci: https://pub.dartlang.org/packages/fluttertoast
Fonctionne très bien sur Android et iOS. entrez la description de l'image ici
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);
vous pouvez utiliser ce package: toast
toast: ^0.1.5
import 'package:toast/toast.dart';
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
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);
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,);
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());
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();
},
)
],
);
});
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é!!!
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..