Bagaimana cara membuat Toast di Flutter?


166

Bisakah saya membuat sesuatu yang mirip dengan Toasts di Flutter? Hanya sebuah jendela notifikasi kecil yang tidak langsung di hadapan pengguna dan tidak mengunci atau memudar tampilan di belakangnya?

Jawaban:


204

Anda dapat mengakses orang tua ScaffoldStatemenggunakanScaffold.of(context)

Kemudian lakukan sesuatu seperti

Scaffold.of(context).showSnackBar(SnackBar(
      content: Text("Sending Message"),
    ));

Snackbars adalah "Toast" resmi dari desain material. Lihat https://material.io/design/components/snackbars.html#usage

Ini adalah contoh yang berfungsi penuh:

masukkan deskripsi gambar di sini

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
Bagaimana ini harus dibungkus dalam onPressed misalnya? karena saya sudah mencobanya dan tidak ada yang muncul di layar.
aziza

Yah, saya tidak pernah cocok dengan cetakan dan saya tahu "resmi" tidak berarti mutlak !! Snackbar benar-benar menyebalkan untuk aplikasi saya UX jadi saya tetap jelas dan selalu menerapkan pemberitahuan gaya popup mengambang yang lebih lama. Saya merasa sangat mudah bagi pengguna untuk melewatkan pemberitahuan Snackbar (terutama jika mereka tidak terbiasa); tetapi tidak mudah untuk melewatkan popup mengambang di tengah, atas atau bawah layar.
SilSur

@aziza membungkus widget tombol Anda di Builder (), ini akan berfungsi
Tabrizapps

Panggilan widget showSnackBar()harus memiliki Scaffoldorangtua.
Lahiru Chandima

80

Gunakan plugin ini

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

masukkan deskripsi gambar di sini


2
Anda harus terlebih dahulu menambahkan ketergantungan Fluttertoast di file pubspec.yaml. Tautan ke ketergantungan ada di sini [tautan] ( pub.dartlang.org/packages/fluttertoast ). Kemudian Anda dapat menggunakan kode di atas
fritz-playmaker

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

1
Sekarang berfungsi, saya harus menghentikan aplikasi dan Jalankan πŸƒβ€β™‚οΈ tanpa men-debug :)
Robin

Siapa pun menghadapi masalah bahwa batas bundar dinonaktifkan setelah menyetel bg color github.com/PonnamKarthik/FlutterToast/issues/156
thanhbinh84

73

SnackBar jelas merupakan kelas yang tepat untuk digunakan, seperti yang ditunjukkan oleh Darky.

snackbar

Satu hal yang sulit tentang showSnackBarmencapai ScaffoldState, jika Anda mencoba memanggil showSnackBardalam metode membangun tempat Anda membangun Scaffold.

Anda mungkin melihat kesalahan seperti ini, yang mencakup beberapa teks yang menjelaskan cara mengatasi masalah.

══║ 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)
════════════════════════════════════════════════════════════════════════════════════════════════════

Anda dapat meneruskan GlobalKeyke Scaffoldkonstruktor:

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

Atau Anda dapat menggunakan Builderuntuk membuat BuildContextyang merupakan anak dari Scaffold.

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

Terakhir, Anda dapat membagi widget menjadi beberapa kelas, yang merupakan pendekatan jangka panjang terbaik.


Mencoba GlobalKey, Sekarang saya mendapatkan pengecualian ini: 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

1
Sepertinya Anda menggunakan GlobalKeyargumen sebagai mana yang BuildContextdiharapkan. Saya tidak dapat membantu Anda men-debug ini lebih lanjut tanpa melihat lebih banyak kode Anda. Silakan kirim baris kode yang melempar pengecualian, mungkin Anda hanya tidak menggunakan argumen yang benar.
Collin Jackson

2
Saya dapat mengkonfirmasi bahwa menggunakan Builderopsi yang Anda berikan berfungsi dengan baik. Berlari ke masalah ini dan ini menyelesaikannya untuk saya.
SeaFuzz

Saya mendapat kesalahan dengan metode GlobalKey tetapi mengambil deklarasi di final key = new GlobalKey<ScaffoldState>();luar Widget build memperbaikinya.
Sagar V

Salah satu jawaban terbaik di StackOverflow! Terima kasih @CollinJackson
Masterfego

13

untuk menampilkan pesan roti panggang, Anda dapat menggunakan plugin flutterToast untuk menggunakan plugin ini

  1. Tambahkan ketergantungan ini ke file pubspec.yaml Anda: - fluttertoast: ^3.1.0
  2. untuk mendapatkan paket Anda harus menjalankan perintah ini: - $ flutter packages get
  3. impor paket: - import 'package:fluttertoast/fluttertoast.dart';

gunakan seperti ini

Fluttertoast.showToast(
        msg: "your message",
        toastLength: Toast.LENGTH_SHORT,
        gravity: ToastGravity.BOTTOM // also possible "TOP" and "CENTER"
        backgroundColor: "#e74c3c",
        textColor: '#ffffff');

Untuk info lebih lanjut, periksa ini


24
Alih-alih menjawab jawaban yang sama yang diposting oleh orang lain, Anda bisa meningkatkan jawabannya.
CopsOnRoad

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

Silakan coba tambahkan satu atau dua kalimat deskriptif yang menjelaskan di mana harus meletakkan kode mana. Sesuatu seperti "Tambahkan paket ke pubspec Anda" dan "Dalam kode, gunakan:"
mlyko

6

Saya ingin memberikan solusi alternatif untuk menggunakan paket flushbar. https://github.com/AndreHaueisen/flushbar
Seperti yang dikatakan paket: Gunakan paket ini jika Anda memerlukan lebih banyak penyesuaian saat memberi tahu pengguna Anda. Untuk pengembang Android, itu dibuat untuk menggantikan toasts dan snackbars.
Saran lain untuk menggunakan flushbar Bagaimana cara menunjukkan snackbar setelah navigator.pop (konteks) di Flutter?
Anda juga dapat mengatur flushbarPosisi ke TOP atau BOTTOM
masukkan deskripsi gambar di sini

    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

Impor lib

fluttertoast: 3.1.3

Gunakan seperti di bawah ini

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

);


4

Jika paket Fluttertoast yang diberikan sejauh ini tidak berfungsi ... Maka saya sarankan Anda mencoba roti panggang .
Tidak memiliki embel-embel dan tidak ada upacara.

masukkan deskripsi gambar di sini

Itu hanya bekerja.

Saya perhatikan ada bug dalam contoh yang diberikan dalam Readme:

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

Sedangkan metode membutuhkan konteks. Jadi sebaiknya tambahkan 'konteks' seperti ini:

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

Ada kemungkinan bahwa ini akan diperbaiki pada saat Anda memeriksa, saya sudah mengirimkan PR.


Saya lebih suka plugin ini daripada pub.dartlang.org/packages/fluttertoastplugin. Yang ini jauh lebih bersih [ringkas] dan lebih mudah untuk disesuaikan.
SilSur

2

Ada tiga cara untuk menunjukkan bersulang di bergetar App.
Saya akan memberi tahu Anda tentang ketiga cara yang saya tahu dan pilih mana yang ingin Anda gunakan. Saya akan merekomendasikan yang kedua.

1: penggunaan paket eksternal.

ini adalah metode pertama yang merupakan cara paling mudah untuk menunjukkan bersulang pada aplikasi bergetar.

pertama-tama Anda harus menambahkan paket ini di pubspec.yaml

flutter_just_toast:^version_here

kemudian impor paket dalam file di mana Anda ingin menunjukkan roti panggang.

'package:flutter_just_toast/flutter_just_toast.dart';

dan langkah terakhir menunjukkan roti panggang.

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

2: menggunakan cara resmi.

metode ini juga sederhana tetapi Anda harus menghadapinya. Saya tidak mengatakan bahwa itu sulit, sederhana dan bersih, saya akan merekomendasikan metode ini.

untuk metode ini yang harus Anda lakukan menunjukkan roti bakar menggunakan kode di bawah ini.

Scaffold.of(context).showSnackBar(SnackBar(
          content: Text("Sending Message"),
        ));

tetapi ingat bahwa Anda harus menggunakan konteks scaffold.

3: menggunakan api asli.

sekarang metode ini tidak masuk akal lagi ketika Anda sudah memiliki dua metode di atas. menggunakan metode ini Anda harus menulis kode asli untuk android dan iOS dan kemudian mengubahnya menjadi plugin dan Anda siap untuk pergi. metode ini akan menghabiskan waktu Anda dan Anda harus menemukan kembali roda. yang telah ditemukan.



1

Tambahkan flutter_just_toast ke dependensi Anda di Pubspecs.yaml Anda

dependensi:

flutter_just_toast: ^1.0.1

Paket impor selanjutnya ke kelas Anda:

import 'package:flutter_just_toast/flutter_just_toast.dart';

Terapkan Toast dengan pesan

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


1

Untuk ini, ada berbagai versi.

1) Pertama-tama, Anda dapat menggunakan SnackBar yang merupakan widget di Flutter.

2) Anda dapat menggunakan perpustakaan seperti roti panggang, flutter_toast dari pub.dev.

3) Versi ketiga adalah membuat widget khusus Anda. Itu dapat dibuat menggunakan widget Hamparan dan Animasi dalam Flutter.

Anda dapat tutorial ini untuk mempelajari lebih lanjut tentang ini. Berikut ini tautannya



0

https://pub.dev/packages/toast gunakan ini untuk bersulang perpustakaan ini cukup mudah digunakan dan berfungsi sempurna untuk ios dan android,

Sintaks untuk show Toast:

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

0

Langkah 1:

dependensi:

flutter_just_toast: ^1.0.1

Langkah 2:

import 'package:flutter_just_toast/flutter_just_toast.dart';

Langkah 3:

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


0

gunakan dependensi ini: toast: ^0.1.3 lalu impor dependensi toast di halaman: import 'package:toast/toast.dart'; lalu onTap () dari widget: Toast.show("Toast plugin app", context,duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);


0

Anda dapat menggunakan paket ini: bersulang

tambahkan baris ini ke dependensi Anda

toast: ^0.1.5

lalu gunakan seperti ini:

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

0

dapatkan paket flutter toast di sini

Tambahkan paket ini ke dependensi proyek Anda di pubspec.yaml

Kemudian setiap kali Anda ingin Toast ditampilkan seperti pada satu ketukan tombol

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

0

Tidak ada widget untuk roti panggang dalam flutter, Anda dapat membuka Usecase plugin ini :

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

0

Anda dapat menggunakan pustaka "fluttertoast". Untuk melakukan ini, tambahkan dalam file pubspec.yaml seperti:

dependencies:
  fluttertoast: ^3.1.0

Kemudian impor pustaka itu dalam file panah yang Anda butuhkan untuk bersulang dan menulis kode Anda. Sebagai contoh, lihat kode berikut:

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

Impor cupertino_icons: ^0.1.2 dan Tulis kode di bawah ini

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

Untuk pesan roti dalam flutter gunakan perpustakaan bot_toast . Perpustakaan ini menyediakan Fitur kaya, dukungan untuk menampilkan pemberitahuan, teks, memuat, lampiran, dll. Roti panggang

masukkan deskripsi gambar di sini


0

Cukup sederhana,

Kami hanya perlu menginstal paket flutter toast. Lihat dokumentasi berikut: https://pub.dev/packages/fluttertoast

Pada tab instal Anda akan mendapatkan dependensi yang harus Anda tempel di pubspec.yaml dan kemudian instal.

Setelah ini, cukup impor paket:

impor 'paket: fluttertoast / fluttertoast.dart';

Mirip dengan garis di atas.

Dan kemudian dengan menggunakan kelas FlutterToast Anda dapat menggunakan fluttertoast Anda.

Kamu sudah selesai!!!


-1

Cukup mudah untuk menampilkan pesan roti panggang dalam Flutter.Scaffold.of(context).showSnackBar(SnackBar( content: Text("Toast Text Here"), ));


-2

Anda dapat menggunakan sesuatu seperti FlutterToast

Impor lib

fluttertoast: ^2.1.4

Gunakan seperti di bawah ini

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

Itu dia..

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.