Відповіді:
Ви можете отримати доступ до батьків 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
це, безумовно, правильний клас для використання, на що вказував Даркі.
Одна складна річ у 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),
);
}
),
);
}
}
Нарешті, ви можете розділити свій віджет на кілька класів, що є найкращим довгостроковим підходом.
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');
Для отримання додаткової інформації перевірте це
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
);
Я хотів би запропонувати альтернативне рішення використовувати флешбар пакету.
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);
Імпортуйте кришку
fluttertoast: 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
плагіном. Цей набагато чистіший [стислий] і простіший у налаштуванні.
Існує три способи показати тост на 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, а потім перетворити його на плагін, і ви готові до роботи. цей спосіб забирає ваш час, і вам доведеться винаходити колесо. що вже винайдено.
Для тих, хто шукає 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 (вміст: текст ("привіт"),) у будь-якій події, як-от onTap та onPress
ви можете прочитати більше про Snackbar тут https://flutter.dev/docs/cookbook/design/snackbars
Для цього існують різні версії.
1) Перш за все, ви можете використовувати SnackBar, який є віджетом у Flutter.
2) Ви можете використовувати бібліотеки, як тост, flutter_toast від pub.dev.
3) Третя версія - це створення власного віджету. Його можна створити за допомогою віджету Overlay та Animation in Flutter.
Ви можете використовувати цей підручник, щоб дізнатися більше про нього. Ось посилання
Для Android-оригінальних тостів з графікою ви можете використовувати це: https://pub.dartlang.org/packages/fluttertoast
Відмінно працює на Android та iOS. введіть тут опис зображення
https://pub.dev/packages/toast використовувати це для тостів ця бібліотека досить проста у використанні та ідеальна робота для ios та android,
Синтаксис шоу Toast:
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,
);
Це воно..