Làm thế nào để tạo Toast trong Flutter?


166

Tôi có thể tạo một cái gì đó tương tự như Toasts trong Flutter không? Chỉ là một cửa sổ thông báo nhỏ không trực tiếp vào mặt người dùng và không khóa hoặc làm mờ tầm nhìn phía sau nó?

Câu trả lời:


204

Bạn có thể truy cập cha mẹ ScaffoldStatebằ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 đủ:

nhập mô tả hình ảnh ở đâ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),
      ),
    );
  }
}

1
Làm thế nào điều này nên được bọc bên trong một onPress chẳng hạn? bởi vì tôi đã thử nó và không có gì hiển thị trên màn hình.
aziza

Chà, tôi không bao giờ phù hợp với khuôn mẫu và tôi biết "chính thức" không có nghĩa là tuyệt đối !! Snackbar thực sự hấp dẫn cho ứng dụng UX của tôi vì vậy tôi hiểu rõ về nó và luôn thực hiện thông báo kiểu popup nổi cũ hơn. Tôi cảm thấy người dùng rất dễ bỏ lỡ các thông báo của Snackbar (đặc biệt là nếu họ không quen với nó); nhưng không dễ để bỏ lỡ một cửa sổ bật lên nổi ở giữa, trên cùng hoặc dưới cùng của màn hình.
SilSur

@aziza gói tiện ích nút của bạn trong Builder (), nó sẽ hoạt động
Tabrizapps

Các cuộc gọi widget showSnackBar()nên có một Scaffoldphụ huynh.
Lahiru Chandima

80

Sử dụng plugin này

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

nhập mô tả hình ảnh ở đây


2
Trước tiên, bạn phải thêm phần phụ thuộc Fluttertoast vào tệp pubspec.yaml. Liên kết đến sự phụ thuộc ở đây [link] ( pub.dartlang.org/packages/fluttertoast ). Sau đó, bạn có thể sử dụng mã trên
fritz-playmaker

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

1
Bây giờ nó hoạt động, tôi cần dừng ứng dụng và Chạy 🏃‍♂️ mà không cần gỡ lỗi :)
Robin

Bất cứ ai cũng phải đối mặt với vấn đề đường viền tròn bị vô hiệu hóa sau khi cài đặt bg màu github.com/PonnamKarthik/FlutterToast/issues/156
thanhbinh84

73

SnackBar chắc chắn là lớp phù hợp để sử dụng, như Darky đã chỉ ra.

đồ ăn nhẹ

Một điều khó khăn showSnackBarlà tìm đến ScaffoldState, nếu bạn đang cố gắng gọi showSnackBartrong 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 BuildContextmộ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.


Đã thử GlobalKey, Bây giờ tôi nhận được ngoại lệ này: 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
Có vẻ như bạn đang sử dụng một GlobalKeyđối số trong đó một BuildContextdự 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ố.
Collin Jackson

2
Tôi có thể xác nhận rằng sử dụng Buildertù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.
SeaFuzz

Tôi đã gặp lỗi với phương thức GlobalKey nhưng việc khai báo final key = new GlobalKey<ScaffoldState>();bên ngoài bản dựng Widget đã sửa nó.
Sagar V

Một trong những câu trả lời hay nhất trong StackOverflow! Cảm ơn @CollinJackson
Masterfego

13

để 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

  1. Thêm phụ thuộc này vào tệp pubspec.yaml của bạn: - fluttertoast: ^3.1.0
  2. để có được gói bạn phải chạy lệnh này: - $ flutter packages get
  3. nhập gói hàng: - 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


24
Thay vì trả lời cùng một câu trả lời được đăng bởi người khác, bạn có thể đã nâng cao câu trả lời của anh ấy.
CopsOnRoad

7

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

Vui lòng thử thêm một hoặc hai câu mô tả để mô tả nơi đặt mã nào. Một cái gì đó như "Thêm gói vào pubspec của bạn" và "Trong mã, sử dụng:"
mlyko

6

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
nhập mô tả hình ảnh ở đây

    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

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,

);


4

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ễ.

nhập mô tả hình ảnh ở đây

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.


Tôi thích plugin này hơn pub.dartlang.org/packages/fluttertoastplugin. Cái này sạch hơn [súc tích] và dễ tùy chỉnh hơn.
SilSur

2

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



1

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


1

Đố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



0

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

0

Bước 1:

phụ thuộc:

flutter_just_toast: ^1.0.1

Bước 2:

import 'package:flutter_just_toast/flutter_just_toast.dart';

Bước 3:

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


0

sử dụng phụ thuộc này: toast: ^0.1.3 sau đó nhập phụ thuộc của bánh mì nướng vào trang: import 'package:toast/toast.dart'; sau đó vào onTap () của tiện ích: Toast.show("Toast plugin app", context,duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);


0

bạn có thể sử dụng gói này: bánh mì nướng

thêm dòng này vào phần phụ thuộc của bạn

toast: ^0.1.5

sau đó sử dụng nó như thế này:

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

0

nhận gói bánh mì nướng ở đây

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

0

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

0

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

0

Nhập cupertino_icons: ^0.1.2viế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();
              },
            )
          ],
        );
      });

0

Đố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.

nhập mô tả hình ảnh ở đây


0

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!!!


-1

Thật dễ dàng để hiển thị Thông báo bánh mì nướng trong Flutter.Scaffold.of(context).showSnackBar(SnackBar( content: Text("Toast Text Here"), ));


-2

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ó..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.