जवाबों:
आप अभिभावक ScaffoldState
का उपयोग कर सकते हैंScaffold.of(context)
फिर कुछ ऐसा करें
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("Sending Message"),
));
स्नैकबार सामग्री डिजाइन से आधिकारिक "टोस्ट" हैं। Https://material.io/design/compenders/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),
);
}
),
);
}
}
या आप स्कैफोल्ड का एक बच्चा 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>();
विजेट निर्माण के बाहर घोषणा को लेते हुए इसे तय किया।
टोस्ट संदेश दिखाने के लिए आप इस प्लगइन का उपयोग करने के लिए 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');
अधिक जानकारी के लिए इसे देखें
स्पंदन: to ३.१.३
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
जैसा कि पैकेज ने कहा: यदि आपको अपने उपयोगकर्ता को सूचित करते समय अधिक अनुकूलन की आवश्यकता हो तो इस पैकेज का उपयोग करें। एंड्रॉइड डेवलपर्स के लिए, यह टोस्ट और स्नैकबार को प्रतिस्थापित करने के लिए बनाया गया है।
फ़्लशबार का उपयोग करने का एक और सुझाव फ़्लटर में नेविगेटर.पॉप (संदर्भ) के बाद स्नैकबार कैसे दिखाना है?
आप टॉप या बॉटम पर फ्लशबारपॉइंट भी सेट कर सकते हैं
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 पैकेज अब तक काम नहीं करता दी ... तो मैं आप की कोशिश का सुझाव देगा टोस्ट ।
इसका कोई तामझाम और कोई समारोह नहीं है।
यह सिर्फ काम करता है।
मैंने हालांकि इसकी रीडमी के भीतर दिए गए उदाहरण में एक बग देखा:
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);
एक मौका है कि यह उस समय तक तय हो जाएगा जब आपने चेक किया था, लेकिन मैंने पहले ही पीआर जमा कर दिया था।
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: देशी आपी का उपयोग करना।
अब इस विधि का कोई मतलब नहीं है जब आपके पास पहले से ही दो तरीके हैं। इस पद्धति का उपयोग करके आपको एंड्रॉइड और आईओएस के लिए मूल कोड लिखना होगा और फिर इसे प्लगइन में बदलना होगा और आप जाने के लिए तैयार हैं। यह विधि आपके समय का उपभोग करेगी और आपको पहिए को फिर से लगाना होगा। जिसका आविष्कार पहले ही हो चुका है।
उन लोगों के लिए Toast
जो मार्ग परिवर्तन से बच सकते हैं SnackBar
, सबसे अच्छा विकल्प नहीं हो सकता है।
Overlay
इसके बजाय एक नजर है ।
अपने Pubspecs.yaml में अपनी निर्भरता के लिए flutter_just_toast जोड़ें
निर्भरता:
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);
महज प्रयोग करें स्नैकबार (सामग्री: टेक्स्ट ("हैलो")), ऑनटैप और ऑनप्रेस जैसे किसी भी घटना के अंदर का उपयोग करें
आप स्नैकबार के बारे में यहाँ और अधिक पढ़ सकते हैं https://flutter.dev/docs/cookbook/design/snackbars
इसके लिए, विभिन्न संस्करण हैं।
1) सबसे पहले, आप SnackBar का उपयोग कर सकते हैं जो Flutter में एक विजेट है।
2) पब से आप लाइब्रेर जैसे टोस्ट, फ्लटर_टोस्ट का उपयोग कर सकते हैं।
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.3
फिर पृष्ठ में टोस्ट की निर्भरता को आयात करें:
import 'package:toast/toast.dart';
फिर विजेट के onTap () पर:
Toast.show("Toast plugin app", context,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);
आप पुस्तकालय "स्पंदन" का उपयोग कर सकते हैं। ऐसा करने के लिए, इसे 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());
आयात 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();
},
)
],
);
});
यह काफी सरल है,
हमें बस स्पंदन टोस्ट पैकेज स्थापित करना होगा। निम्नलिखित दस्तावेज देखें: https://pub.dev/packages/fluttertoast
इंस्टॉलिंग टैब में आपको निर्भरता मिलेगी जिसे आपको इसे pubspec.yaml औरthen इंस्टॉल में पेस्ट करना होगा।
इसके बाद बस पैकेज आयात करें:
आयात 'पैकेज: 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,
);
बस..