Jawaban:
Anda dapat mengakses orang tua ScaffoldState
menggunakanScaffold.of(context)
Kemudian lakukan sesuatu seperti
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("Sending Message"),
));
Snackbars adalah "Toast" resmi dari desain material. Lihat https://material.io/design/components/snackbars.html#usage
Ini adalah contoh yang berfungsi penuh:
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()
harus memiliki Scaffold
orangtua.
Gunakan plugin ini
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
jelas merupakan kelas yang tepat untuk digunakan, seperti yang ditunjukkan oleh Darky.
Satu hal yang sulit tentang showSnackBar
mencapai ScaffoldState
, jika Anda mencoba memanggil showSnackBar
dalam metode membangun tempat Anda membangun Scaffold
.
Anda mungkin melihat kesalahan seperti ini, yang mencakup beberapa teks yang menjelaskan cara mengatasi masalah.
βββ‘ 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)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Anda dapat meneruskan GlobalKey
ke Scaffold
konstruktor:
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),
);
}
),
);
}
}
Atau Anda dapat menggunakan Builder
untuk membuat BuildContext
yang merupakan anak dari Scaffold.
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),
);
}
),
);
}
}
Terakhir, Anda dapat membagi widget menjadi beberapa kelas, yang merupakan pendekatan jangka panjang terbaik.
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
argumen sebagai mana yang BuildContext
diharapkan. Saya tidak dapat membantu Anda men-debug ini lebih lanjut tanpa melihat lebih banyak kode Anda. Silakan kirim baris kode yang melempar pengecualian, mungkin Anda hanya tidak menggunakan argumen yang benar.
Builder
opsi yang Anda berikan berfungsi dengan baik. Berlari ke masalah ini dan ini menyelesaikannya untuk saya.
final key = new GlobalKey<ScaffoldState>();
luar Widget build memperbaikinya.
untuk menampilkan pesan roti panggang, Anda dapat menggunakan plugin flutterToast untuk menggunakan plugin ini
fluttertoast: ^3.1.0
$ flutter packages get
import 'package:fluttertoast/fluttertoast.dart';
gunakan seperti ini
Fluttertoast.showToast(
msg: "your message",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM // also possible "TOP" and "CENTER"
backgroundColor: "#e74c3c",
textColor: '#ffffff');
Untuk info lebih lanjut, periksa ini
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
);
Saya ingin memberikan solusi alternatif untuk menggunakan paket flushbar.
https://github.com/AndreHaueisen/flushbar
Seperti yang dikatakan paket: Gunakan paket ini jika Anda memerlukan lebih banyak penyesuaian saat memberi tahu pengguna Anda. Untuk pengembang Android, itu dibuat untuk menggantikan toasts dan snackbars.
Saran lain untuk menggunakan flushbar Bagaimana cara menunjukkan snackbar setelah navigator.pop (konteks) di Flutter?
Anda juga dapat mengatur flushbarPosisi ke TOP atau 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);
Impor lib
fluttertoast: 3.1.3
Gunakan seperti di bawah ini
Fluttertoast.showToast(
msg: "Hello world",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,
);
Jika paket Fluttertoast yang diberikan sejauh ini tidak berfungsi ... Maka saya sarankan Anda mencoba roti panggang .
Tidak memiliki embel-embel dan tidak ada upacara.
Itu hanya bekerja.
Saya perhatikan ada bug dalam contoh yang diberikan dalam Readme:
Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Sedangkan metode membutuhkan konteks. Jadi sebaiknya tambahkan 'konteks' seperti ini:
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Ada kemungkinan bahwa ini akan diperbaiki pada saat Anda memeriksa, saya sudah mengirimkan PR.
pub.dartlang.org/packages/fluttertoast
plugin. Yang ini jauh lebih bersih [ringkas] dan lebih mudah untuk disesuaikan.
Ada tiga cara untuk menunjukkan bersulang di bergetar App.
Saya akan memberi tahu Anda tentang ketiga cara yang saya tahu dan pilih mana yang ingin Anda gunakan. Saya akan merekomendasikan yang kedua.
1: penggunaan paket eksternal.
ini adalah metode pertama yang merupakan cara paling mudah untuk menunjukkan bersulang pada aplikasi bergetar.
pertama-tama Anda harus menambahkan paket ini di pubspec.yaml
flutter_just_toast:^version_here
kemudian impor paket dalam file di mana Anda ingin menunjukkan roti panggang.
'package:flutter_just_toast/flutter_just_toast.dart';
dan langkah terakhir menunjukkan roti panggang.
Toast.show( message: "Your toast message",
duration: Delay.SHORT,
textColor: Colors.black);
2: menggunakan cara resmi.
metode ini juga sederhana tetapi Anda harus menghadapinya. Saya tidak mengatakan bahwa itu sulit, sederhana dan bersih, saya akan merekomendasikan metode ini.
untuk metode ini yang harus Anda lakukan menunjukkan roti bakar menggunakan kode di bawah ini.
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("Sending Message"),
));
tetapi ingat bahwa Anda harus menggunakan konteks scaffold.
3: menggunakan api asli.
sekarang metode ini tidak masuk akal lagi ketika Anda sudah memiliki dua metode di atas. menggunakan metode ini Anda harus menulis kode asli untuk android dan iOS dan kemudian mengubahnya menjadi plugin dan Anda siap untuk pergi. metode ini akan menghabiskan waktu Anda dan Anda harus menemukan kembali roda. yang telah ditemukan.
Untuk orang-orang yang mencari Toast
apa yang bisa selamat dari perubahan rute SnackBar
mungkin bukan pilihan terbaik.
Lihatlah Overlay
sebagai gantinya.
Tambahkan flutter_just_toast ke dependensi Anda di Pubspecs.yaml Anda
dependensi:
flutter_just_toast: ^1.0.1
Paket impor selanjutnya ke kelas Anda:
import 'package:flutter_just_toast/flutter_just_toast.dart';
Terapkan Toast dengan pesan
Toast.show( message: "Your toast message",
duration: Delay.SHORT,
textColor: Colors.black);
cukup gunakan SnackBar (konten: Teks ("halo"),) di dalam acara apa pun seperti onTap dan onPress
Anda dapat membaca lebih lanjut tentang Snackbar di sini https://flutter.dev/docs/cookbook/design/snackbars
Untuk ini, ada berbagai versi.
1) Pertama-tama, Anda dapat menggunakan SnackBar yang merupakan widget di Flutter.
2) Anda dapat menggunakan perpustakaan seperti roti panggang, flutter_toast dari pub.dev.
3) Versi ketiga adalah membuat widget khusus Anda. Itu dapat dibuat menggunakan widget Hamparan dan Animasi dalam Flutter.
Anda dapat tutorial ini untuk mempelajari lebih lanjut tentang ini. Berikut ini tautannya
Untuk roti panggang grafis orisinal android Anda dapat menggunakan ini: https://pub.dartlang.org/packages/fluttertoast
Berfungsi dengan baik di Android dan iOS. masukkan deskripsi gambar di sini
https://pub.dev/packages/toast gunakan ini untuk bersulang perpustakaan ini cukup mudah digunakan dan berfungsi sempurna untuk ios dan android,
Sintaks untuk show Toast:
Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Anda dapat menggunakan paket ini: bersulang
toast: ^0.1.5
import 'package:toast/toast.dart';
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
dapatkan paket flutter toast di sini
Tambahkan paket ini ke dependensi proyek Anda di pubspec.yaml
Kemudian setiap kali Anda ingin Toast ditampilkan seperti pada satu ketukan tombol
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Tidak ada widget untuk roti panggang dalam flutter, Anda dapat membuka Usecase plugin ini :
Fluttertoast.showToast(
msg: "My toast messge",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,);
Anda dapat menggunakan pustaka "fluttertoast". Untuk melakukan ini, tambahkan dalam file pubspec.yaml seperti:
dependencies:
fluttertoast: ^3.1.0
Kemudian impor pustaka itu dalam file panah yang Anda butuhkan untuk bersulang dan menulis kode Anda. Sebagai contoh, lihat kode berikut:
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());
Impor cupertino_icons: ^0.1.2
dan Tulis kode di bawah ini
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();
},
)
],
);
});
Untuk pesan roti dalam flutter gunakan perpustakaan bot_toast . Perpustakaan ini menyediakan Fitur kaya, dukungan untuk menampilkan pemberitahuan, teks, memuat, lampiran, dll. Roti panggang
Cukup sederhana,
Kami hanya perlu menginstal paket flutter toast. Lihat dokumentasi berikut: https://pub.dev/packages/fluttertoast
Pada tab instal Anda akan mendapatkan dependensi yang harus Anda tempel di pubspec.yaml dan kemudian instal.
Setelah ini, cukup impor paket:
impor 'paket: fluttertoast / fluttertoast.dart';
Mirip dengan garis di atas.
Dan kemudian dengan menggunakan kelas FlutterToast Anda dapat menggunakan fluttertoast Anda.
Kamu sudah selesai!!!
Anda dapat menggunakan sesuatu seperti FlutterToast
Impor lib
fluttertoast: ^2.1.4
Gunakan seperti di bawah ini
Fluttertoast.showToast(
msg: "Hello world",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,
);
Itu dia..