Могу ли я создать нечто похожее на Тосты в Флаттере? Просто крошечное окно уведомлений, которое не находится прямо перед лицом пользователя и не блокирует или не исчезает за ним?
Как создать 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
Вот полностью рабочий пример:
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.
Одна сложная вещь о 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
);
Ответ 4
чтобы показать тост сообщение, вы можете использовать плагин flutterToast, чтобы использовать этот плагин, вы должны
- Добавьте эту зависимость в ваш файл pubspec.yaml: -
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');
Для получения дополнительной информации проверьте это
Ответ 5
Я хотел бы предоставить альтернативное решение для использования пакета 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);
Ответ 6
В случае, если данный пакет 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.
Ответ 7
Для Android оригинальной графики тост вы можете использовать это: https://pub.dartlang.org/packages/fluttertoast
Отлично работает на Android и iOS. введите описание изображения здесь
Ответ 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
вместо этого.
Ответ 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-
Это действительно легко реализовать. И вы можете настроить тост как угодно.
Ответ 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());