Câu trả lời:
Bạn có thể truy cập cha mẹ ScaffoldState
bằng cách sử dụngScaffold.of(context)
Sau đó làm một cái gì đó như
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("Sending Message"),
));
Snackbars là "Toast" chính thức từ thiết kế vật liệu. Xem https: // m vật liệu.io/design/components/snackbars.html#usage
Dưới đây là một ví dụ hoạt động đầy đủ:
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()
nên có một Scaffold
phụ huynh.
Sử dụng plugin này
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
chắc chắn là lớp phù hợp để sử dụng, như Darky đã chỉ ra.
Một điều khó khăn showSnackBar
là tìm đến ScaffoldState
, nếu bạn đang cố gắng gọi showSnackBar
trong phương thức xây dựng nơi bạn xây dựng Scaffold
.
Bạn có thể thấy một lỗi như thế này, bao gồm một số văn bản giải thích cách giải quyết vấn đề.
══╡ 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)
════════════════════════════════════════════════════════════════════════════════════════════════════
Bạn có thể chuyển một GlobalKey
đến hàm tạo của mình 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),
);
}
),
);
}
}
Hoặc bạn có thể sử dụng một Builder
để tạo ra BuildContext
một đứa con của Giàn giáo.
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),
);
}
),
);
}
}
Cuối cùng, bạn có thể chia widget của bạn thành nhiều lớp, đây là cách tiếp cận dài hạn tốt nhất.
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
đối số trong đó một BuildContext
dự kiến. Tôi không thể giúp bạn gỡ lỗi này thêm mà không cần xem thêm mã của bạn. Vui lòng gửi dòng mã đang ném ngoại lệ, có thể bạn không sử dụng đúng đối số.
Builder
tùy chọn bạn đã cho hoạt động tốt. Chạy vào vấn đề này và điều này đã giải quyết nó cho tôi.
final key = new GlobalKey<ScaffoldState>();
bên ngoài bản dựng Widget đã sửa nó.
để hiển thị thông báo bánh mì nướng, bạn có thể sử dụng plugin flutterToast để sử dụng plugin này, bạn phải
fluttertoast: ^3.1.0
$ flutter packages get
import 'package:fluttertoast/fluttertoast.dart';
sử dụng nó như thế này
Fluttertoast.showToast(
msg: "your message",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.BOTTOM // also possible "TOP" and "CENTER"
backgroundColor: "#e74c3c",
textColor: '#ffffff');
Để biết thêm thông tin kiểm tra này
rung cảm: ^ 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
);
Tôi muốn cung cấp giải pháp thay thế để sử dụng gói flushbar.
https://github.com/AndreHaueisen/flushbar
Như gói đã nói: Sử dụng gói này nếu bạn cần thêm tùy chỉnh khi thông báo cho người dùng của mình. Đối với các nhà phát triển Android, nó được tạo ra để thay thế bánh mì nướng và snackbars.
Một đề xuất khác để sử dụng flushbar Làm thế nào để hiển thị snackbar sau navigator.pop (bối cảnh) trong Flutter?
Bạn cũng có thể đặt flushbarPocation thành TOP hoặc 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);
Nhập lib
rung cảm: 3.1.3
Sử dụng như dưới đây
Fluttertoast.showToast(
msg: "Hello world",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,
);
Trong trường hợp gói Fluttertoast được cung cấp cho đến nay không hoạt động ... Sau đó, tôi sẽ đề nghị bạn thử nướng bánh mì .
Nó không rườm rà và không có lễ.
Nó chỉ hoạt động.
Tôi nhận thấy một lỗi trong ví dụ được đưa ra trong Readme của nó:
Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Trong khi phương pháp đòi hỏi một bối cảnh. Vì vậy, làm tốt để thêm "bối cảnh" như thế này:
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Có khả năng điều này sẽ được khắc phục vào thời điểm bạn kiểm tra, tôi đã gửi PR.
pub.dartlang.org/packages/fluttertoast
plugin. Cái này sạch hơn [súc tích] và dễ tùy chỉnh hơn.
Có ba cách để hiển thị bánh mì nướng trên Ứng dụng rung.
Tôi sẽ nói với bạn về cả ba cách mà tôi biết và chọn cách bạn muốn sử dụng. Tôi muốn giới thiệu cái thứ hai.
1: sử dụng gói bên ngoài.
đây là phương pháp đầu tiên là cách dễ nhất để hiển thị bánh mì nướng trên ứng dụng rung.
trước hết bạn phải thêm gói này trong pubspec.yaml
flutter_just_toast:^version_here
sau đó nhập gói trong tệp mà bạn muốn hiển thị bánh mì nướng.
'package:flutter_just_toast/flutter_just_toast.dart';
và bước cuối cùng cho thấy bánh mì nướng.
Toast.show( message: "Your toast message",
duration: Delay.SHORT,
textColor: Colors.black);
2: sử dụng cách chính thức.
phương pháp này cũng đơn giản nhưng bạn phải đối phó với nó. Tôi không nói rằng nó khó, nó đơn giản và sạch sẽ, tôi muốn giới thiệu phương pháp này.
đối với phương pháp này, tất cả những gì bạn phải làm là hiển thị bánh mì nướng đang sử dụng mã dưới đây.
Scaffold.of(context).showSnackBar(SnackBar(
content: Text("Sending Message"),
));
nhưng hãy nhớ rằng bạn phải sử dụng bối cảnh giàn giáo.
3: sử dụng api bản địa.
bây giờ phương thức này không còn ý nghĩa nữa khi bạn đã có hai phương pháp trên. sử dụng phương pháp này, bạn phải viết mã riêng cho Android và iOS và sau đó chuyển đổi nó thành plugin và bạn đã sẵn sàng để đi. phương pháp này sẽ tiêu tốn thời gian của bạn và bạn phải phát minh lại bánh xe. mà đã được phát minh
Đối với những người đang tìm kiếm một Toast
thứ có thể sống sót thay đổi tuyến đường thì SnackBar
có thể không phải là lựa chọn tốt nhất.
Có một cái nhìn Overlay
thay thế.
Thêm flutter_just_toast vào phần phụ thuộc của bạn trong Pubspecs.yaml
phụ thuộc:
flutter_just_toast: ^1.0.1
Gói nhập tiếp theo vào lớp của bạn:
import 'package:flutter_just_toast/flutter_just_toast.dart';
Thực hiện Toast với thông điệp
Toast.show( message: "Your toast message",
duration: Delay.SHORT,
textColor: Colors.black);
chỉ cần sử dụng SnackBar (nội dung: Văn bản ("xin chào"),) bên trong bất kỳ sự kiện nào như onTap và onPress
bạn có thể đọc thêm về Snackbar tại đây https://flutter.dev/docs/cookbook/design/snackbars
Đối với điều này, có các phiên bản khác nhau.
1) Trước hết, bạn có thể sử dụng SnackBar, một tiện ích trong Flutter.
2) Bạn có thể sử dụng các thư viện như bánh mì nướng, flutter_toast từ pub.dev.
3) Phiên bản thứ ba đang tạo widget tùy chỉnh của bạn. Nó có thể được tạo bằng tiện ích Lớp phủ và Hoạt hình trong Flutter.
Bạn có thể hướng dẫn này để tìm hiểu thêm về nó. Đây là một liên kết
Đối với bánh mì nướng đồ họa gốc Android, bạn có thể sử dụng: https://pub.dartlang.org/packages/fluttertoast
Hoạt động tốt trên Android và iOS. nhập mô tả hình ảnh ở đây
https://pub.dev/packages/toast sử dụng điều này cho bánh mì nướng thư viện này khá dễ sử dụng và công việc hoàn hảo cho ios và Android,
Cú pháp cho chương trình Toast:
Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
bạn có thể sử dụng gói này: bánh mì nướng
toast: ^0.1.5
import 'package:toast/toast.dart';
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Thêm gói này vào các phụ thuộc dự án của bạn trong pubspec.yaml
Sau đó, bất cứ khi nào bạn muốn bánh mì nướng được hiển thị như trên một nút nhấn
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
Không có tiện ích nào cho bánh mì nướng trong rung, Bạn có thể truy cập plugin này Usecase:
Fluttertoast.showToast(
msg: "My toast messge",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,);
Bạn có thể sử dụng thư viện "fluttertoast". Để làm điều này, hãy thêm nó trong tệp pubspec.yaml như:
dependencies:
fluttertoast: ^3.1.0
Sau đó nhập thư viện đó vào tệp phi tiêu bạn cần bánh mì nướng và viết mã của bạn. Ví dụ: tham khảo đoạn mã sau:
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());
Nhập cupertino_icons: ^0.1.2
và viết mã dưới đây
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();
},
)
],
);
});
Đối với tin nhắn bánh mì nướng trong rung, sử dụng thư viện bot_toast . Thư viện này cung cấp nhiều tính năng, hỗ trợ hiển thị thông báo, văn bản, tải, tệp đính kèm, v.v.
Nó khá đơn giản,
Chúng ta chỉ cần cài đặt gói bánh mì nướng rung. Tham khảo tài liệu sau: https://pub.dev/packages/fluttertoast
Trong tab cài đặt, bạn sẽ nhận được phần phụ thuộc mà bạn phải dán vào phần cài đặt pubspec.yaml và sau đó.
Sau này chỉ cần nhập gói:
nhập 'gói: fluttertoast / fluttertoast.dart';
Tương tự như dòng trên.
Và sau đó bằng cách sử dụng lớp FlutterToast, bạn có thể sử dụng fluttertoast của mình.
Bạn đã hoàn tất!!!
Bạn có thể sử dụng một cái gì đó như FlutterToast
Nhập lib
fluttertoast: ^2.1.4
Sử dụng như dưới đây
Fluttertoast.showToast(
msg: "Hello world",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,
);
Đó là nó..