我可以在Flutter中创建类似Toasts的东西吗?
只是一个很小的通知窗口,不直接面对用户,也不锁定或淡出它后面的视图。
我可以在Flutter中创建类似Toasts的东西吗?
只是一个很小的通知窗口,不直接面对用户,也不锁定或淡出它后面的视图。
当前回答
小吃店
当我尝试使用脚手架状态对象(由其他人建议)的解决方案时,我得到了一个警告,它已弃用:
'showSnackBar'已弃用,不应该使用。使用ScaffoldMessenger.showSnackBar。此特性在v1.23.0-14.0.pre..之后已弃用。
使用ScaffoldMessenger可以正常工作:
ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text("My amazing message! O.o")));
例子:
其他回答
答案Scaffold.of(context). showsnackbar(…)在大多数情况下都不起作用。
我建议最佳的方法是在类中声明一个Scaffold state键,并将其分配给Scaffold,如下所示:
GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
然后
Scaffold(
key: _scaffoldKey,
...
)
当你想要显示零食栏时,这样做:
_scaffoldKey.currentState.showSnackBar(SnackBar(
content: Text("This works!"),
));
更新:Scaffold.of(上下文)。showSnackBar在Flutter 2.0.0中已弃用(稳定)
你可以使用ScaffoldMessenger.of(context)访问父类ScaffoldMessengerState。
然后做一些类似的事情
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text("Sending Message"),
));
零食条是材料设计的官方“吐司”。看到间小吃店。
下面是一个完整的例子:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: 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'),
),
body: Center(
child: RaisedButton(
onPressed: () => _showToast(context),
child: const Text('Show toast'),
),
),
);
}
void _showToast(BuildContext context) {
final scaffold = ScaffoldMessenger.of(context);
scaffold.showSnackBar(
SnackBar(
content: const Text('Added to favorite'),
action: SnackBarAction(label: 'UNDO', onPressed: scaffold.hideCurrentSnackBar),
),
);
}
}
你可以很容易地实现这种效果使用叠加。
代码:
OverlayEntry entry = OverlayEntry(builder: (context) {
return Positioned(
top: MediaQuery.of(context).size.height * 0.8,
child: Container(
width: MediaQuery.of(context).size.width,
alignment: Alignment.center,
child: const Card(
color: Colors.redAccent,
child: Padding(
padding: EdgeInsets.all(8),
child: Text("This is a message."),
),
),
));
});
//show overlay
Overlay.of(context)!.insert(entry);
//auto remove this overlay after 3 seconds
Future.delayed(const Duration(seconds: 3)).then((value) => entry.remove());
截图:
你可以使用FlutterToast之类的软件。
导入库:
fluttertoast: ^2.1.4
像下面这样使用它:
Fluttertoast.showToast(
msg: "Hello, World!",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,
);
就是这样……
导入库fluttertoast: 3.1.3
像下面这样使用它:
Fluttertoast.showToast(
msg: "Hello, World!",
textColor: Colors.white,
toastLength: Toast.LENGTH_SHORT,
timeInSecForIos: 1,
gravity: ToastGravity.BOTTOM,
backgroundColor: Colors.indigo,
);