++++ 2019 年 7 月更新 ++++
我写了一个支持应用程序范围消息显示的包。
EZ Flutter 是小部件、包和许多有用的东西的集合,混合在一个小框架中。目的是从头开始提供标准功能。EZ Flutter 支持通过一行代码从应用程序内的任何位置向用户显示消息。
Github:https ://github.com/Ephenodrom/EZ-Flutter
dependencies:
ez_flutter: ^0.2.0
查看文档如何使用不同的配置。
https://github.com/Ephenodrom/EZ-Flutter/blob/master/documentation/GLOBAL_MESSAGE.md
++++老答案++++
也许这个例子会有所帮助:
https://github.com/Ephenodrom/Flutter-Advanced-Examples/tree/master/lib/examples/globalMessage
这个想法是有一个消息包装器小部件,它显示带有被推送到 BLOC 中的快餐栏的消息。
class GlobalMessageWrapper extends StatefulWidget {
final Widget child;
GlobalMessageWrapper(this.child);
@override
_GlobalMessageWrapperState createState() => _GlobalMessageWrapperState();
}
class _GlobalMessageWrapperState extends State<GlobalMessageWrapper> {
@override
Widget build(BuildContext context) {
return StreamBuilder(
initialData: null,
stream: BlocProvider.of<GlobalBloc>(context).messageBloc.messageStream,
builder: (BuildContext context, AsyncSnapshot<Message> snapshot) {
Message msg = snapshot.data;
if (msg != null) {
WidgetsBinding.instance
.addPostFrameCallback((_) => _showMessage(msg));
}
return Container(child: widget.child);
});
}
void _showMessage(Message message) {
Color color = Colors.grey;
switch (message.type) {
case "success":
color = Colors.green;
break;
case "info":
color = Colors.blue;
break;
case "warning":
color = Colors.orange;
break;
case "error":
color = Colors.red;
break;
default:
}
SnackBar bar = SnackBar(
content: Padding(
padding: const EdgeInsets.only(bottom: 50.0),
child: Text(message.text),
),
backgroundColor: color);
Scaffold.of(context)
..hideCurrentSnackBar()
..showSnackBar(bar);
}
}
要在您的应用程序中全局使用 Wrapper,请将其放在小部件树的顶部。您可以将它放在 main.dart 文件中的 MaterialApp Widget 下。