如何在 Flutter 中创建和使用 SnackBar 以进行重用(全局)
how to Create and Use SnackBar for ReUse(Globally) in Flutter
我想创建 SnackBar
用于可重用(全局)
我已经创建了,但它只用于 1 页,我不知道如何创建 可重复使用。
下面的代码:
import 'package:flutter/material.dart';
class SnackBarMain extends StatefulWidget {
@override
_SnackBarMainState createState() => _SnackBarMainState();
}
class _SnackBarMainState extends State<SnackBarMain> {
final globalKey = GlobalKey<ScaffoldState>();
String title = 'SnackBar';
@override
Widget build(BuildContext context) {
return Scaffold(
key: globalKey,
resizeToAvoidBottomPadding: false,
appBar: AppBar(
centerTitle: true,
title: Text(title),
),
body: Center(
child: RaisedButton(
shape: new RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(18.0),
side: BorderSide(color: Colors.purple)),
onPressed: () => snackBarMsg(context),
color: Colors.purple,
textColor: Colors.white,
child: Text("SnackBar",
style: TextStyle(fontSize: 18)),
),
),
);
}
snackBarMsg(BuildContext context) {
final sb = SnackBar(
elevation: 0.0,
//behavior: SnackBarBehavior.floating,
content: Text('SnackBar Bottom Message'),
duration: new Duration(seconds: 5000000),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0)),
),
//backgroundColor: Colors.redAccent,
action: SnackBarAction(
textColor: Color(0xFFFAF2FB),
label: 'OK',
onPressed: () {},
),
);
globalKey.currentState.showSnackBar(sb);
}
}
所以任何人都请给我举个例子
您可以使用您已经定义的 Snackbar
将其放在 public 文件夹中以在任何地方重复使用它,该文件夹可以从您应用程序的任何位置访问。您不需要将它包含在小部件或 class 中。然后,您可以通过调用 Scaffold.of(context).showSnackBar(...)
来显示它。为此,您当然需要通过当前 BuildContext
。这样,只要您调用 showSnackBar
的 context
有父级 Scaffold
,就会显示当前页面的快餐栏,您可以从任何地方执行此操作。
考虑这个我自己过去使用过的例子:
void buildErrorSnackbar(BuildContext context) {
Scaffold.of(context).showSnackBar(
SnackBar(
content: Text("Oops! Something went wrong."),
),
);
}
你可以有一个 class
,它有一个静态方法 show()
,它接收 context
并显示 snackbar
。
检查下面的代码。
class GlobalSnackBar {
final String message;
const GlobalSnackBar({
@required this.message,
});
static show(
BuildContext context,
String message,
) {
Scaffold.of(context).showSnackBar(
SnackBar(
elevation: 0.0,
//behavior: SnackBarBehavior.floating,
content: Text(message),
duration: new Duration(seconds: 5000000),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0)),
),
//backgroundColor: Colors.redAccent,
action: SnackBarAction(
textColor: Color(0xFFFAF2FB),
label: 'OK',
onPressed: () {},
),
),
);
}
}
您可以像这样从任何地方调用它:
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RaisedButton(
child: Text('SHOW Snackbar'),
onPressed: () => GlobalSnackBar.show(context, 'Test'),
);
}
}
请记住,您传递给 show()
方法的 context
必须是 Scaffold
的后代才能显示 SnackBar
只需创建一个 public class 并将您的自定义函数放入其中,例如:
//Custom class in project directory
class CustomWidgets {
CustomWidgets._();
static buildErrorSnackbar(BuildContext context, String message) {
Scaffold.of(context)
.showSnackBar(
SnackBar(
content: Text("$message"),
),
);
}
}
// This is any page in your project
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
// Always create body with Builder method so you can
// get exact context to pass
body: Builder(
builder: (context) =>
Center(
child: RaisedButton(
color: Colors.pink,
textColor: Colors.white,
onPressed: (){
CustomWidgets.buildErrorSnackbar(context,"Your message here");
},
child: Text('Display SnackBar'),
),
),
),
);
}
}
Scaffold.of(context).showSnackbar 现在已弃用。您应该改用 ScaffoldMessenger。像这样使用:-
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('User Successfully Logged In...'),
));
我想创建 SnackBar
用于可重用(全局)
我已经创建了,但它只用于 1 页,我不知道如何创建 可重复使用。
下面的代码:
import 'package:flutter/material.dart';
class SnackBarMain extends StatefulWidget {
@override
_SnackBarMainState createState() => _SnackBarMainState();
}
class _SnackBarMainState extends State<SnackBarMain> {
final globalKey = GlobalKey<ScaffoldState>();
String title = 'SnackBar';
@override
Widget build(BuildContext context) {
return Scaffold(
key: globalKey,
resizeToAvoidBottomPadding: false,
appBar: AppBar(
centerTitle: true,
title: Text(title),
),
body: Center(
child: RaisedButton(
shape: new RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(18.0),
side: BorderSide(color: Colors.purple)),
onPressed: () => snackBarMsg(context),
color: Colors.purple,
textColor: Colors.white,
child: Text("SnackBar",
style: TextStyle(fontSize: 18)),
),
),
);
}
snackBarMsg(BuildContext context) {
final sb = SnackBar(
elevation: 0.0,
//behavior: SnackBarBehavior.floating,
content: Text('SnackBar Bottom Message'),
duration: new Duration(seconds: 5000000),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0)),
),
//backgroundColor: Colors.redAccent,
action: SnackBarAction(
textColor: Color(0xFFFAF2FB),
label: 'OK',
onPressed: () {},
),
);
globalKey.currentState.showSnackBar(sb);
}
}
所以任何人都请给我举个例子
您可以使用您已经定义的 Snackbar
将其放在 public 文件夹中以在任何地方重复使用它,该文件夹可以从您应用程序的任何位置访问。您不需要将它包含在小部件或 class 中。然后,您可以通过调用 Scaffold.of(context).showSnackBar(...)
来显示它。为此,您当然需要通过当前 BuildContext
。这样,只要您调用 showSnackBar
的 context
有父级 Scaffold
,就会显示当前页面的快餐栏,您可以从任何地方执行此操作。
考虑这个我自己过去使用过的例子:
void buildErrorSnackbar(BuildContext context) {
Scaffold.of(context).showSnackBar(
SnackBar(
content: Text("Oops! Something went wrong."),
),
);
}
你可以有一个 class
,它有一个静态方法 show()
,它接收 context
并显示 snackbar
。
检查下面的代码。
class GlobalSnackBar {
final String message;
const GlobalSnackBar({
@required this.message,
});
static show(
BuildContext context,
String message,
) {
Scaffold.of(context).showSnackBar(
SnackBar(
elevation: 0.0,
//behavior: SnackBarBehavior.floating,
content: Text(message),
duration: new Duration(seconds: 5000000),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16.0), topRight: Radius.circular(16.0)),
),
//backgroundColor: Colors.redAccent,
action: SnackBarAction(
textColor: Color(0xFFFAF2FB),
label: 'OK',
onPressed: () {},
),
),
);
}
}
您可以像这样从任何地方调用它:
class MyWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return RaisedButton(
child: Text('SHOW Snackbar'),
onPressed: () => GlobalSnackBar.show(context, 'Test'),
);
}
}
请记住,您传递给 show()
方法的 context
必须是 Scaffold
的后代才能显示 SnackBar
只需创建一个 public class 并将您的自定义函数放入其中,例如:
//Custom class in project directory
class CustomWidgets {
CustomWidgets._();
static buildErrorSnackbar(BuildContext context, String message) {
Scaffold.of(context)
.showSnackBar(
SnackBar(
content: Text("$message"),
),
);
}
}
// This is any page in your project
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
// Always create body with Builder method so you can
// get exact context to pass
body: Builder(
builder: (context) =>
Center(
child: RaisedButton(
color: Colors.pink,
textColor: Colors.white,
onPressed: (){
CustomWidgets.buildErrorSnackbar(context,"Your message here");
},
child: Text('Display SnackBar'),
),
),
),
);
}
}
Scaffold.of(context).showSnackbar 现在已弃用。您应该改用 ScaffoldMessenger。像这样使用:-
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('User Successfully Logged In...'),
));