Flutterでトーストを作成する方法は?


166

FlutterのToastsのようなものを作成できますか?ユーザーの正面に直接表示されず、背後のビューをロックまたはフェードしない、小さな通知ウィンドウだけですか?

回答:


204

あなたは親にアクセスすることができますScaffoldState使用してScaffold.of(context)

次に、次のようなことをします

Scaffold.of(context).showSnackBar(SnackBar(
      content: 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),
      ),
    );
  }
}

1
これは、たとえばonPressed内にどのようにラップする必要がありますか?試してみましたが、画面に何も表示されません。
aziza 2017

まあ、私は金型に適合したことはありませんし、「公式」は絶対的なものではないことを知っています!スナックバーは私のアプリのUXを本当に苦手にしているので、私はそれを十分に避け、常に古いフローティングポップアップスタイルの通知を実装します。ユーザーがSnackbar通知を見逃すのは非常に簡単だと思います(特に、慣れていない場合)。しかし、画面の中央、上部、または下部に浮かぶポップアップを見逃すことは簡単ではありません。
SilSur

@azizaは、ボタンウィジェットをBuilder()でラップします。これは機能します
Tabrizapps

ウィジェットの呼び出しにshowSnackBar()Scaffold親が必要です。
Lahiru Chandima

80

このプラグインを使用

Fluttertoast.showToast(
        msg: "This is Toast messaget",
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.CENTER,
        timeInSecForIos: 1
    );

ここに画像の説明を入力してください


2
最初にFluttertoast依存関係をpubspec.yamlファイルに追加する必要があります。依存関係へのリンクはここにあります[リンク](pub.dartlang.org/packages/fluttertoast)。その後、上記のコードを使用できます
fritz-playmaker '15

Unhandled Exception: MissingPluginException(No implementation found for method showToast on channel PonnamKarthik/fluttertoast)
ロビン

1
これで機能しました。アプリを停止してデバッグなしでRun️を実行する必要があります:)
ロビン


73

SnackBar Darkyが指摘したように、これは間違いなく適切なクラスです。

スナックバー

の1つのトリッキーな点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),
          );
        }
      ),
    );
  }
}

または、を使用しBuilderBuildContextScaffoldの子であるを作成できます。

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),
          );
        }
      ),
    );
  }
}

最後に、ウィジェットを複数のクラスに分割することができます。これは、長期的な最善のアプローチです。


GlobalKeyを試したところ、次の例外が発生しました 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
。– Shajeel Afzal 2017

1
が期待されるGlobalKey場所で引数としてa を使用しているようですBuildContext。私はあなたがあなたのコードをもっと見ることなくこれをさらにデバッグするのを助けることはできません。例外をスローしているコード行を投稿してください。おそらく正しい引数を使用していない可能性があります。
コリンジャクソン

2
Builderあなたが与えたオプションを使うことはうまくいくことを確認できます。この問題にぶつかると、これで解決しました。
-SeaFuzz

GlobalKeyメソッドでエラーが発生しましたがfinal key = new GlobalKey<ScaffoldState>();、ウィジェットビルドの外部で宣言を取得すると修正されました。
Sagar V

StackOverflowのベストアンサーの1つです。ありがとう@CollinJackson
Masterfego

13

トーストメッセージを表示するには、flutterToastプラグインを使用して、このプラグインを使用する必要があります

  1. この依存関係をpubspec.yamlファイルに追加します。 fluttertoast: ^3.1.0
  2. パッケージを取得するには、このコマンドを実行する必要があります:- $ flutter packages get
  3. パッケージをインポートする:- 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');

詳細情報について確認し、これを


24
他の誰かが投稿した同じ答えに答える代わりに、彼の答えに賛成票を投じることができます。
CopsOnRoad 2018年

7

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
    );

どのコードをどこに置くかを説明する説明文を1つか2つ追加してみてください。「pubspecにパッケージを追加する」や「コードでは次のように使用する」のようなもの
mlyko

6

パッケージフラッシュバーを使用する代替ソリューションを提供したいと思います。 https://github.com/AndreHaueisen/flushbar
パッケージが言ったように:ユーザーに通知するときにさらにカスタマイズが必要な場合は、このパッケージを使用してください。Android開発者のために、トーストとスナックバーの代わりに作られています。
フラッシュバーを使用する別の提案Flutterでnavigator.pop(context)の後にスナックバーを表示 する方法は?
また、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);

5

ライブラリをインポートする

fluttertoast:3.1.3

以下のように使用

Fluttertoast.showToast(
msg: "Hello world",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,

);


4

これまでに示したFluttertoastパッケージが機能しない場合...次に、トーストを試すことをお勧めします。
フリルやセレモニーはありません。

ここに画像の説明を入力してください

うまくいきます。

ただし、Readme内の例にバグがあることに気づきました。

Toast.show("Toast plugin app", duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);

メソッドにはコンテキストが必要ですが。したがって、次のように 'context'を追加するとうまくいきます。

Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);

あなたがチェックした時までにこれは修正された可能性があります、私はすでにPRを提出しました。


私はpub.dartlang.org/packages/fluttertoastプラグインよりもこのプラグインを好みます。これはかなり簡潔で、簡潔にカスタマイズできます。
SilSur

2

フラッターアプリでトーストを表示する方法は3つあります。
私が知っている3つの方法すべてについて説明し、どちらを使用するかを選択します。2つ目をお勧めします。

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:ネイティブAPIを使用します。

現在、上記の2つの方法がすでにある場合、この方法はもはや意味がありません。この方法を使用すると、AndroidおよびiOSのネイティブコードを記述して、それをプラグインに変換する必要があります。この方法はあなたの時間を消費し、あなたは車輪を再発明する必要があります。これはすでに発明されています。



1

Flutter_just_toastをPubspecs.yamlの依存関係に追加します

依存関係:

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);


1

このため、さまざまなバージョンがあります。

1)まず、FlutterのウィジェットであるSnackBarを使用できます。

2)pub.devのtoast、flutter_toastなどのライブラリを使用できます。

3)3番目のバージョンは、カスタムウィジェットを作成しています。Flutterのオーバーレイウィジェットとアニメーションを使用して作成できます。

詳細については、このチュートリアルをご覧ください。ここにリンクがあります




0

ステップ1:

依存関係:

flutter_just_toast: ^1.0.1

ステップ2:

import 'package:flutter_just_toast/flutter_just_toast.dart';

ステップ3:

Toast.show(
message: "Your toast message",
duration: Delay.SHORT,
textColor: Colors.black);


0

この依存関係を使用 toast: ^0.1.3 します。import 'package:toast/toast.dart'; 次に、ページにトーストの依存関係をインポートします。 次に、ウィジェットのonTap()を使用します。 Toast.show("Toast plugin app", context,duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);


0

このパッケージを使用できます:トースト

この行を依存関係に追加します

toast: ^0.1.5

次に、次のように使用します。

import 'package:toast/toast.dart';
Toast.show("Toast plugin app", context, duration: Toast.LENGTH_SHORT, gravity:  Toast.BOTTOM);


0

フラッターでトーストするウィジェットはありません。このプラグインの ユースケースに移動できます

Fluttertoast.showToast(
msg: "My toast messge",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,);

0

ライブラリ「fluttertoast」を利用できます。これを行うには、次のようにpubspec.yamlファイルに追加します。

dependencies:
  fluttertoast: ^3.1.0

次に、トーストが必要なdartファイルにそのライブラリをインポートし、コードを記述します。たとえば、次のコードを参照してください。

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());

0

以下のコードをインポート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();
              },
            )
          ],
        );
      });

0

flutterのトーストメッセージには、bot_toastライブラリを使用します。このライブラリは、通知、テキスト、読み込み、添付ファイルなどを表示するための機能豊富なサポートを提供します。トースト

ここに画像の説明を入力してください


0

とても簡単です

flutter toastパッケージをインストールするだけです。次のドキュメントを参照してください。https//pub.dev/packages/fluttertoast

インストールタブでは、pubspec.yamlに貼り付けてインストールする必要がある依存関係が表示されます。

この後、パッケージをインポートします。

import 'package:fluttertoast / fluttertoast.dart';

上記の行に似ています。

そして、FlutterToastクラスを使用することで、fluttertoastを使用できます。

完了しました!!!


-1

Flutterでトーストメッセージを表示するのは非常に簡単です。Scaffold.of(context).showSnackBar(SnackBar( content: Text("Toast Text Here"), ));


-2

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,
);

それでおしまい..

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.