Yanıtlar:
Ebeveyne aşağıdakileri ScaffoldState
kullanarak erişebilirsiniz:Scaffold.of(context)
Sonra böyle bir şey yap
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("Sending Message"),
));
Snackbarlar malzeme tasarımından resmi "Tost" dur. Bkz. Https://material.io/design/components/snackbars.html#usage
İşte tam olarak çalışan bir örnek:
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()
bir Scaffold
üst öğesi olmalıdır .
Bu eklentiyi kullan
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'nin işaret ettiği gibi kesinlikle kullanılacak doğru sınıftır.
Bir zor şey hakkında showSnackBar
hiç oluyor ScaffoldState
aramak çalışıyorsanız, showSnackBar
sen senin inşa inşa yöntemi içinde Scaffold
.
Sorunun nasıl çözüleceğini açıklayan bazı metinler içeren böyle bir hata görebilirsiniz.
══╡ 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)
════════════════════════════════════════════════════════════════════════════════════════════════════
Ya bir geçebilir GlobalKey
sizin için Scaffold
yapıcı:
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),
);
}
),
);
}
}
Ya da İskele'nin alt öğesi olan bir Builder
oluşturmak BuildContext
için a'yı kullanabilirsiniz.
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),
);
}
),
);
}
}
Son olarak, widget'ınızı en iyi uzun vadeli yaklaşım olan birden fazla sınıfa ayırabilirsiniz.
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
bir argüman olarak kullanıyorsunuz BuildContext
. Daha fazla kod görmeden bu hata ayıklama yardımcı olamaz. Lütfen istisnayı ortaya koyan kod satırını gönderin, muhtemelen doğru argümanları kullanmıyorsunuzdur.
Builder
Verdiğiniz seçeneği kullanarak iyi çalıştığını onaylayabilirim . Bu sorunla karşılaştı ve bu benim için çözdü.
final key = new GlobalKey<ScaffoldState>();
Widget'ın dışında bildirimi alarak düzeltti.
tost mesajını göstermek için flutterToast eklentisini kullanarak bu eklentiyi kullanabilirsiniz
fluttertoast: ^3.1.0
$ flutter packages get
import 'package:fluttertoast/fluttertoast.dart';
böyle kullan
Fluttertoast.showToast(
msg: "your message",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM // also possible "TOP" and "CENTER"
backgroundColor: "#e74c3c",
textColor: '#ffffff');
Daha fazla bilgi için kontrol bu
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
);
Paket yıkama çubuğunu kullanmak için alternatif bir çözüm sunmak istiyorum.
https://github.com/AndreHaueisen/flushbar
Paketin dediği gibi: Kullanıcıyı bilgilendirirken daha fazla özelleştirmeye ihtiyacınız varsa bu paketi kullanın. Android geliştiricileri için, tost ve snackbarların yerine kullanılır.
Yıkama çubuğunun kullanılması için başka bir öneri Flutter'da navigator.pop (bağlam) sonrasında snackbar nasıl gösterilir?
Yıkama çubuğunu da TOP veya ALT olarak ayarlayabilirsiniz
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);
Lib'i içe aktarın
çarpıntı: 3.1.3
Aşağıdaki gibi kullanın
Fluttertoast.showToast(
msg: "Hello world",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,
);
Şimdiye kadar verilen Fluttertoast paketinin işe yaramaması durumunda ... O zaman tost denemenizi öneririm .
Fırfırları ve töreni yok.
Sadece çalışıyor.
Ben de Benioku içinde verilen örnek içinde bir hata fark ettim:
Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Yöntem bir bağlam gerektirirken. Öyleyse böyle 'bağlam' eklemek için iyi yapın:
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Bu, kontrol ettiğiniz zamana kadar düzeltilmiş olma şansı var, zaten bir PR gönderdim.
pub.dartlang.org/packages/fluttertoast
. Bu çok daha temiz [özlü] ve özelleştirilmesi daha kolay.
Çırpınan App tost göstermek için üç yolu vardır.
Size üç yöntemden bahsedeceğim ve hangisini kullanmak istediğinizi seçeceğim. İkincisini tavsiye ederim.
1: harici paket kullanımı.
Bu, çarpıntı uygulamasında tost göstermenin en kolay yolu olan ilk yöntemdir.
her şeyden önce bu paketi pubspec.yaml dosyasına eklemelisiniz
flutter_just_toast:^version_here
ardından paketi tost göstermek istediğiniz dosyaya aktarın.
'package:flutter_just_toast/flutter_just_toast.dart';
ve son adım tostu gösterir.
Toast.show( message: "Your toast message",
duration: Delay.SHORT,
textColor: Colors.black);
2: resmi yolu kullanarak.
bu yöntem de basit ama bununla başa çıkmak zorundasınız. Basit ve temiz olduğunu söylemek zor değilim bu yöntemi tavsiye ederim.
bu yöntem için tost göstermek için yapmanız gereken tek şey aşağıdaki kodu kullanıyor.
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("Sending Message"),
));
ancak iskele bağlamını kullanmanız gerektiğini unutmayın.
3: doğal API kullanarak.
Şimdi bu yöntem, yukarıdaki iki yönteme zaten sahip olduğunuzda artık anlamlı değildir. bu yöntemi kullanarak android ve iOS için yerel kod yazmak ve sonra eklentiye dönüştürmek zorundasınız ve gitmeye hazırsınız. bu yöntem zamanınızı tüketir ve tekerleği yeniden icat etmeniz gerekir. zaten icat edilmişti.
Toast
Hayatta kalabilecek bir şeyi arayanlar için rota değişiklikleri SnackBar
en iyi seçenek olmayabilir.
Overlay
Bunun yerine bir göz atın .
Pubspecs.yaml dosyasındaki bağımlılıklarınıza flutter_just_toast ekleyin
bağımlılıkları:
flutter_just_toast: ^1.0.1
Sonraki içe aktarma paketi sınıfınıza:
import 'package:flutter_just_toast/flutter_just_toast.dart';
Tost'u mesajla uygula
Toast.show( message: "Your toast message",
duration: Delay.SHORT,
textColor: Colors.black);
SnackBar kullanın (içerik: Metin ("merhaba"),) ONTAP ve onPress gibi herhangi bir olay içeride
Snackbar hakkında daha fazla bilgiyi burada bulabilirsiniz https://flutter.dev/docs/cookbook/design/snackbars
Bunun için farklı versiyonlar var.
1) Her şeyden önce, Flutter'da bir widget olan SnackBar'ı kullanabilirsiniz.
2) pub.dev'den tost, flutter_toast gibi kütüphaneleri kullanabilirsiniz.
3) Üçüncü sürüm özel widget'ınızı oluşturuyor. Flutter'da Overlay widget'ı ve Animasyon kullanılarak oluşturulabilir.
Daha fazla bilgi edinmek için bu öğreticiyi kullanabilirsiniz. İşte bir bağlantı
Android orijinal grafik tost için bunu kullanabilirsiniz: https://pub.dartlang.org/packages/fluttertoast
Android ve iOS'ta iyi çalışır. resim açıklamasını buraya girin
https://pub.dev/packages/toast bunu tost için kullanın Bu kütüphanenin kullanımı oldukça kolay ve ios ve android için mükemmel bir çalışma,
Show Toast için sözdizimi:
Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
bu paketi kullanabilirsiniz: tost
toast: ^0.1.5
import 'package:toast/toast.dart';
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Çırpılmış tost paketini buradan alın
Bu paketi pubspec.yaml dosyasındaki proje bağımlılıklarınıza ekleyin
Ardından Tost'un bir düğmeye dokunarak gösterilmesini istediğinizde
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Çırpıda tost için herhangi bir widget yok, bu eklentiye gidebilirsiniz
Fluttertoast.showToast(
msg: "My toast messge",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,);
"Fluttertoast" kütüphanesini kullanabilirsiniz. Bunu yapmak için pubspec.yaml dosyasına aşağıdaki gibi ekleyin:
dependencies:
fluttertoast: ^3.1.0
Sonra bu kütüphaneyi dart dosyasına ihtiyacınız olan tost dosyasına aktarın ve kodunuzu yazın. Örneğin, aşağıdaki koda bakın:
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());
Aşağıdaki kodu içe aktarıncupertino_icons: ^0.1.2
ve yazın
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();
},
)
],
);
});
Çarpıntıdaki tost mesajı için bot_toast kütüphanesini kullanın . Bu kütüphane Zengin özelliklere sahip, bildirimleri, metni, yükleme, ekleri vb. Görüntülemek için destek sağlar.
Oldukça basit,
Sadece çarpıntı tost paketini kurmamız gerekiyor. Aşağıdaki belgelere bakın: https://pub.dev/packages/fluttertoast
Yükleme sekmesinde, pubspec.yaml dosyasına yapıştırmanız gereken bağımlılığı ve daha sonra yüklemeyi alacaksınız.
Bundan sonra paketi içe aktarın:
import 'package: fluttertoast / fluttertoast.dart';
Yukarıdaki çizgiye benzer.
Ve sonra FlutterToast sınıfını kullanarak fluttertoast'ınızı kullanabilirsiniz.
Sen bittin!!!
FlutterToast gibi bir şey kullanabilirsiniz
Lib'i içe aktarın
fluttertoast: ^2.1.4
Aşağıdaki gibi kullanın
Fluttertoast.showToast(
msg: "Hello world",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,
);
Bu kadar..