Flutter'da Tost nasıl oluşturulur?


167

Flutter'da Toasts benzeri bir şey oluşturabilir miyim ? Doğrudan kullanıcının karşısında olmayan ve arkasındaki görünümü kilitlemeyen veya solmayan küçük bir bildirim penceresi mi?

Yanıtlar:


205

Ebeveyne aşağıdakileri ScaffoldStatekullanarak erişebilirsiniz:Scaffold.of(context)

Sonra böyle bir şey yap

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

Snackbarlar malzeme tasarımından resmi "Tost" dur. Bkz. Https://material.io/design/components/snackbars.html#usage

İşte tam olarak çalışan bir örnek:

resim açıklamasını buraya girin

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
Bu, örneğin bir onPressed içine nasıl sarılmalıdır? çünkü denedim ve ekranda hiçbir şey görünmüyor.
aziza

Asla kalıba uymuyorum ve biliyorum ki "resmi" mutlak demek değil !! Snackbar gerçekten benim app UX için berbat, bu yüzden iyi açık kalmak ve her zaman eski kayan pop-up tarzı bildirim uygulamak. Kullanıcıların Snackbar bildirimlerini kaçırmasını çok kolay hissediyorum (özellikle buna alışkın değilse); ancak ekranın ortasında, üstünde veya altında yüzen bir açılır pencereyi kaçırmak kolay değildir.
SilSur

@aziza Builder'da () düğme widget'ı sarın, işe yarayacak
Tabrizapps

Widget çağrısının showSnackBar()bir Scaffoldüst öğesi olmalıdır .
Lahiru Chandima

80

Bu eklentiyi kullan

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

resim açıklamasını buraya girin


2
Önce pubspec.yaml dosyasına Fluttertoast bağımlılığını eklemelisiniz. Bağımlılığa bağlantı burada [link] ( pub.dartlang.org/packages/fluttertoast ). O zaman yukarıdaki kodu kullanabilirsiniz
fritz-playmaker

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

1
Şimdi çalışıyor, uygulamayı durdurmam ve hata ayıklamadan without‍♂️ çalıştırmam gerekiyor :)
Robin

Herkes yuvarlak sınır ayarı bg renk sonrasında devre dışı olduğunu sorunla karşı karşıya github.com/PonnamKarthik/FlutterToast/issues/156
thanhbinh84

73

SnackBar Darky'nin işaret ettiği gibi kesinlikle kullanılacak doğru sınıftır.

snackbar

Bir zor şey hakkında showSnackBarhiç oluyor ScaffoldStatearamak çalışıyorsanız, showSnackBarsen senin inşa inşa yöntemi içinde Scaffold.

Sorunun nasıl çözüleceğini açıklayan bazı metinler içeren böyle bir hata görebilirsiniz.

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

Ya bir geçebilir GlobalKeysizin için Scaffoldyapıcı:

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

Ya da İskele'nin alt öğesi olan bir Builderoluşturmak BuildContextiçin a'yı kullanabilirsiniz.

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

Son olarak, widget'ınızı en iyi uzun vadeli yaklaşım olan birden fazla sınıfa ayırabilirsiniz.


GlobalKey'i Denedim, Şimdi bu istisnayı alıyorum: 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
Görünüşe göre a'nın beklendiği GlobalKeybir argüman olarak kullanıyorsunuz BuildContext. Daha fazla kod görmeden bu hata ayıklama yardımcı olamaz. Lütfen istisnayı ortaya koyan kod satırını gönderin, muhtemelen doğru argümanları kullanmıyorsunuzdur.
Collin Jackson

2
BuilderVerdiğiniz seçeneği kullanarak iyi çalıştığını onaylayabilirim . Bu sorunla karşılaştı ve bu benim için çözdü.
SeaFuzz

GlobalKey yöntemiyle ilgili bir hata aldım ama final key = new GlobalKey<ScaffoldState>();Widget'ın dışında bildirimi alarak düzeltti.
Sagar V

StackOverflow'daki en iyi cevaplardan biri! Thanks @CollinJackson
Masterfego

13

tost mesajını göstermek için flutterToast eklentisini kullanarak bu eklentiyi kullanabilirsiniz

  1. Bu bağımlılığı pubspec.yaml dosyanıza ekleyin: - fluttertoast: ^3.1.0
  2. paketi almak için şu komutu çalıştırmanız gerekir: - $ flutter packages get
  3. paketi içe aktar: - import 'package:fluttertoast/fluttertoast.dart';

böyle kullan

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

Daha fazla bilgi için kontrol bu


24
Başka biri tarafından gönderilen aynı cevabı cevaplamak yerine, cevabını iptal etmiş olabilirsiniz.
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
    );

Lütfen hangi kodu nereye koyacağınızı açıklayan bir veya iki tanımlayıcı cümle eklemeyi deneyin. "Pubspec'inize paket ekleyin" ve "Kod olarak şunu kullanın:" gibi bir şey
mlyko

6

Paket yıkama çubuğunu kullanmak için alternatif bir çözüm sunmak istiyorum. https://github.com/AndreHaueisen/flushbar
Paketin dediği gibi: Kullanıcıyı bilgilendirirken daha fazla özelleştirmeye ihtiyacınız varsa bu paketi kullanın. Android geliştiricileri için, tost ve snackbarların yerine kullanılır.
Yıkama çubuğunun kullanılması için başka bir öneri Flutter'da navigator.pop (bağlam) sonrasında snackbar nasıl gösterilir?
Yıkama çubuğunu da TOP veya ALT olarak ayarlayabilirsiniz
resim açıklamasını buraya girin

    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

Lib'i içe aktarın

çarpıntı: 3.1.3

Aşağıdaki gibi kullanın

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

);


4

Şimdiye kadar verilen Fluttertoast paketinin işe yaramaması durumunda ... O zaman tost denemenizi öneririm .
Fırfırları ve töreni yok.

resim açıklamasını buraya girin

Sadece çalışıyor.

Ben de Benioku içinde verilen örnek içinde bir hata fark ettim:

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

Yöntem bir bağlam gerektirirken. Öyleyse böyle 'bağlam' eklemek için iyi yapın:

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

Bu, kontrol ettiğiniz zamana kadar düzeltilmiş olma şansı var, zaten bir PR gönderdim.


Bu eklentiyi eklenti yerine tercih ederim pub.dartlang.org/packages/fluttertoast. Bu çok daha temiz [özlü] ve özelleştirilmesi daha kolay.
SilSur

2

Çırpınan App tost göstermek için üç yolu vardır.
Size üç yöntemden bahsedeceğim ve hangisini kullanmak istediğinizi seçeceğim. İkincisini tavsiye ederim.

1: harici paket kullanımı.

Bu, çarpıntı uygulamasında tost göstermenin en kolay yolu olan ilk yöntemdir.

her şeyden önce bu paketi pubspec.yaml dosyasına eklemelisiniz

flutter_just_toast:^version_here

ardından paketi tost göstermek istediğiniz dosyaya aktarın.

'package:flutter_just_toast/flutter_just_toast.dart';

ve son adım tostu gösterir.

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

2: resmi yolu kullanarak.

bu yöntem de basit ama bununla başa çıkmak zorundasınız. Basit ve temiz olduğunu söylemek zor değilim bu yöntemi tavsiye ederim.

bu yöntem için tost göstermek için yapmanız gereken tek şey aşağıdaki kodu kullanıyor.

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

ancak iskele bağlamını kullanmanız gerektiğini unutmayın.

3: doğal API kullanarak.

Şimdi bu yöntem, yukarıdaki iki yönteme zaten sahip olduğunuzda artık anlamlı değildir. bu yöntemi kullanarak android ve iOS için yerel kod yazmak ve sonra eklentiye dönüştürmek zorundasınız ve gitmeye hazırsınız. bu yöntem zamanınızı tüketir ve tekerleği yeniden icat etmeniz gerekir. zaten icat edilmişti.



1

Pubspecs.yaml dosyasındaki bağımlılıklarınıza flutter_just_toast ekleyin

bağımlılıkları:

flutter_just_toast: ^1.0.1

Sonraki içe aktarma paketi sınıfınıza:

import 'package:flutter_just_toast/flutter_just_toast.dart';

Tost'u mesajla uygula

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


1

Bunun için farklı versiyonlar var.

1) Her şeyden önce, Flutter'da bir widget olan SnackBar'ı kullanabilirsiniz.

2) pub.dev'den tost, flutter_toast gibi kütüphaneleri kullanabilirsiniz.

3) Üçüncü sürüm özel widget'ınızı oluşturuyor. Flutter'da Overlay widget'ı ve Animasyon kullanılarak oluşturulabilir.

Daha fazla bilgi edinmek için bu öğreticiyi kullanabilirsiniz. İşte bir bağlantı



0

https://pub.dev/packages/toast bunu tost için kullanın Bu kütüphanenin kullanımı oldukça kolay ve ios ve android için mükemmel bir çalışma,

Show Toast için sözdizimi:

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

0

Aşama 1:

bağımlılıkları:

flutter_just_toast: ^1.0.1

Adım 2:

import 'package:flutter_just_toast/flutter_just_toast.dart';

Aşama 3:

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


0

bu bağımlılığı kullanın: toast: ^0.1.3 sonra tost bağımlılığını sayfadan içe aktarın: import 'package:toast/toast.dart'; sonra widget'ın onTap () öğesine: Toast.show("Toast plugin app", context,duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM);


0

bu paketi kullanabilirsiniz: tost

bu satırı bağımlılıklarına ekle

toast: ^0.1.5

sonra şu şekilde kullanın:

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

0

Çırpılmış tost paketini buradan alın

Bu paketi pubspec.yaml dosyasındaki proje bağımlılıklarınıza ekleyin

Ardından Tost'un bir düğmeye dokunarak gösterilmesini istediğinizde

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

0

Çırpıda tost için herhangi bir widget yok, bu eklentiye gidebilirsiniz

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

0

"Fluttertoast" kütüphanesini kullanabilirsiniz. Bunu yapmak için pubspec.yaml dosyasına aşağıdaki gibi ekleyin:

dependencies:
  fluttertoast: ^3.1.0

Sonra bu kütüphaneyi dart dosyasına ihtiyacınız olan tost dosyasına aktarın ve kodunuzu yazın. Örneğin, aşağıdaki koda bakın:

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

Aşağıdaki kodu içe aktarıncupertino_icons: ^0.1.2 ve yazın

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

Oldukça basit,

Sadece çarpıntı tost paketini kurmamız gerekiyor. Aşağıdaki belgelere bakın: https://pub.dev/packages/fluttertoast

Yükleme sekmesinde, pubspec.yaml dosyasına yapıştırmanız gereken bağımlılığı ve daha sonra yüklemeyi alacaksınız.

Bundan sonra paketi içe aktarın:

import 'package: fluttertoast / fluttertoast.dart';

Yukarıdaki çizgiye benzer.

Ve sonra FlutterToast sınıfını kullanarak fluttertoast'ınızı kullanabilirsiniz.

Sen bittin!!!


-1

Flutter'da bir Tost Mesajı göstermek oldukça kolaydır.Scaffold.of(context).showSnackBar(SnackBar( content: Text("Toast Text Here"), ));


-2

FlutterToast gibi bir şey kullanabilirsiniz

Lib'i içe aktarın

fluttertoast: ^2.1.4

Aşağıdaki gibi kullanın

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

Bu kadar..

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.