Flutterで Toasts のようなものを作成できますか?ユーザーに直接表示されず、その背後にあるビューをロックまたはフェードしない、ごくわずかな通知ウィンドウですか?
Scaffold.of(context)
を使用して、親ScaffoldState
にアクセスできます。
それから何かをする
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),
),
);
}
}
Darkyが指摘しているように、SnackBar
は間違いなく正しいクラスです。
showSnackBar
を構築する場所であるbuildメソッド内でScaffoldState
を呼び出そうとしているのであれば、showSnackBar
に関する1つの難しいことは、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),
);
}
),
);
}
}
最後に、ウィジェットを複数のクラスに分割することができます。これは長期的な最善の方法です。
これを使う plugin
Fluttertoast.showToast(
msg: "This is Toast messaget",
toastLength: Toast.LENGTH_SHORT,
gravity: ToastGravity.CENTER,
timeInSecForIos: 1
);
トーストメッセージを表示するには、flutterToastプラグインを使用してこのプラグインを使用する必要があります。
fluttertoast: ^2.0.7
$ 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');
より詳しい情報は--- this を参照してください。
これまでに与えられたFluttertoastパッケージがうまくいかない場合…それでは toast を試してみることをお勧めします。
フリルも儀式もありません。
それだけでうまくいきます。
私はその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を提出しました。
パッケージflushbarを使用するための代替ソリューションを提供したいと思います。 https://github.com/AndreHaueisen/flushbar
パッケージが言ったように:あなたのユーザに通知するときもっとカスタマイズが必要な場合はこのパッケージを使ってください。 Android開発者にとっては、トーストやスナックバーの代わりになるように作られています。
flushbarを使用するためのもう1つの提案 Flutterでnavigator.pop(context)の後にsnackbarを表示する方法?
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);
Toast
を探している人にとっては、ルートの変更に耐えることができるものはSnackBar
が最良の選択肢ではないかもしれません。
代わりにOverlay
をご覧ください。
Androidのオリジナルグラフィックトーストの場合は、これを使用できます。 https://pub.dartlang.org/packages/fluttertoast
AndroidとiOSでは問題なく動作します。 ここに画像の説明を入力してください
https://pub.dev/packages/toast これをトーストに使用するこのライブラリは使いやすく、iOSとAndroidに最適です。
Show Toastの構文:
Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
この依存関係を使用してください:toast: ^0.1.3
それからページにtoastの依存関係をインポートしてください:import 'package:toast/toast.Dart';
それからウィジェットのonTap()の上:Toast.show("Toast plugin app", context,duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);
依存関係:
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);