Ответы:
Вы можете получить доступ к родителю, 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),
),
);
}
}
showSnackBar()
должен быть Scaffold
родитель.
Используйте этот плагин
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
безусловно, правильный класс для использования, как указал 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),
);
}
),
);
}
}
Наконец, вы можете разделить ваш виджет на несколько классов, что является лучшим долгосрочным подходом.
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
в качестве аргумента, где BuildContext
ожидается. Я не могу помочь вам отладить это дальше, не видя больше вашего кода. Пожалуйста, опубликуйте строку кода, которая вызывает исключение, возможно, вы просто не используете правильные аргументы.
Builder
вами опции хорошо работает. Столкнулся с этой проблемой, и это решило ее для меня.
final key = new GlobalKey<ScaffoldState>();
вне сборки Widget было исправлено.
чтобы показать тост сообщение, вы можете использовать плагин flutterToast, чтобы использовать этот плагин, вы должны
fluttertoast: ^3.1.0
$ flutter packages get
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');
Для получения дополнительной информации проверьте это
трепетание: ^ 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
);
Я хотел бы предоставить альтернативное решение для использования пакета 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);
Импортируйте библиотеку
трепетание: 3.1.3
Используйте как ниже
Fluttertoast.showToast(
msg: "Hello world",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,
);
В случае, если данный пакет 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
плагином. Это намного чище [лаконичнее] и проще в настройке.
Есть три способа показать тост на флаттере приложения.
Я расскажу вам обо всех трех известных мне способах и выберу тот, который вы хотите использовать. Я бы порекомендовал второй.
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, а затем преобразовать его в плагин, и вы готовы к работе. Этот метод будет занимать ваше время, и вам придется изобретать велосипед. который уже был изобретен.
Для тех, кто ищет то, Toast
что может выжить, маршрут меняетSnackBar
могут быть не лучшим вариантом.
Взгляните Overlay
вместо этого.
Добавьте 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);
просто используйте SnackBar (content: Text ("hello"),) внутри любого события, такого как onTap и onPress
Вы можете прочитать больше о Snackbar здесь https://flutter.dev/docs/cookbook/design/snackbars
Для этого есть разные версии.
1) Прежде всего, вы можете использовать SnackBar, который является виджетом во Flutter.
2) Вы можете использовать библиотеки, такие как toast, flutter_toast из pub.dev.
3) Третья версия создает ваш собственный виджет. Его можно создать с помощью виджета «Наложение» и «Анимация во флаттере».
Вы можете это руководство, чтобы узнать больше об этом. Вот ссылка
Для Android оригинальной графики тост вы можете использовать это: https://pub.dartlang.org/packages/fluttertoast
Отлично работает на Android и iOS. введите описание изображения здесь
https://pub.dev/packages/toast использовать это для тоста, эта библиотека довольно проста в использовании и отлично работает для iOS и Android,
Синтаксис для шоу Тост:
Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Вы можете использовать этот пакет: тост
toast: ^0.1.5
import 'package:toast/toast.dart';
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
получить пакет тостов трепетать здесь
Добавьте этот пакет в зависимости вашего проекта в pubspec.yaml
Затем всякий раз, когда вы хотите, чтобы тост показывался как по нажатию кнопки
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Там нет виджета для тостов во флаттере, вы можете перейти к этому плагину Usecase:
Fluttertoast.showToast(
msg: "My toast messge",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,);
Вы можете использовать библиотеку "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());
Импорт 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();
},
)
],
);
});
Для сообщения о тосте во флаттере используйте библиотеку bot_toast . Эта библиотека предоставляет многофункциональные функции, поддержку отображения уведомлений, текста, загрузки, вложений и т. Д.
Это довольно просто,
Нам просто нужно установить пакет тостов. Обратитесь к следующей документации: https://pub.dev/packages/fluttertoast
На вкладке установки вы получите зависимость, которую нужно вставить в файл pubspec.yaml и затем установить.
После этого просто импортируйте пакет:
импортировать «пакет: fluttertoast / fluttertoast.dart»;
Аналогично вышеприведенной строке.
И затем, используя класс FlutterToast, вы можете использовать свой fluttertoast.
Вы сделали !!!
Вы можете использовать что-то вроде 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,
);
Это оно..