如何在没有脚手架的情况下显示snackBar

Cod*_*ter 10 dart snackbar flutter flutter-layout

我试图在我的应用程序中显示小吃店以通知用户,但没有脚手架它会显示我的错误。我目前的代码是:

scaffoldKey.currentState?.showSnackBar(
    new SnackBar(
      backgroundColor: color ?? Colors.red,
      duration: Duration(milliseconds: milliseconds),
      content: Container(
        height: 50.0,
        child: Center(
          child: new Text(
            title,
            style: AppTheme.textStyle.lightText.copyWith(color: Colors.white),
            overflow: TextOverflow.ellipsis,
          ),
        ),
      ),
    ),
  )
Run Code Online (Sandbox Code Playgroud)

Bug*_*lla 83

如果您可以从laszlo 的回答中访问上下文,只需调用

ScaffoldMessenger.of(context).showSnackBar(snackBar);
Run Code Online (Sandbox Code Playgroud)

如果您没有上下文(例如:显示网络请求错误),请根据Miguel Ruvio的回答使用此代码段

我们将使用脚手架MessengerKey 属性,它允许我们仅使用一个 GlobalKey 即可显示小吃栏,而无需上下文。此外,无需添加像 Get 这样的第 3 方包。


首先,创建一个globals.dart来存储一个GlobalKey

//globals.dart

import 'package:flutter/material.dart';

final GlobalKey<ScaffoldMessengerState> snackbarKey =
    GlobalKey<ScaffoldMessengerState>();

Run Code Online (Sandbox Code Playgroud)

二、向MaterialApp添加scaffoldMessengerKey属性

//main.dart

import 'globals.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Test',
      scaffoldMessengerKey: snackbarKey, // <= this
      ...
Run Code Online (Sandbox Code Playgroud)

最后,在任何地方引用此键即可显示 Snackbar

// anywhere

import 'globals.dart';

final SnackBar snackBar = SnackBar(content: Text("your snackbar message"));
snackbarKey.currentState?.showSnackBar(snackBar); 
Run Code Online (Sandbox Code Playgroud)


Mik*_*chy 10

它可以获取当前上下文并像这样显示snackbar:

void _showToast(BuildContext context) {
  final scaffold = Scaffold.of(context);
  scaffold.showSnackBar(
    SnackBar(
      content: const Text('Updating..'),
    ),
  );
}

this._showToast(context);
Run Code Online (Sandbox Code Playgroud)

  • 如果没有脚手架上下文,您就无法显示小吃栏。 (7认同)

Man*_*han 6

不,这是不可能的。Snackbar 是 Scaffold 的一部分。它必须有一个 Scaffold 父级。小吃店

在 Scaffold 父级中,您可以执行以下操作

BuildContext con=context;
final snackBar = SnackBar(content: Text(message));
Scaffold.of(con).showSnackBar(snackBar);
Run Code Online (Sandbox Code Playgroud)