Flutter通知构建插件notification_builder的使用
Flutter通知构建插件notification_builder的使用
notification_builder 
听力增强:一个通过构建上下文分发的通知来构建的部件。
目录
关于
通知——是Flutter用于在小部件树层次结构中传递数据的工具。在你的小部件树深处,你可以触发一个通知,它将像气泡一样向上移动。然后,在顶部,你可以使用NotificationBuilder
来构建你的UI。
问题
想象以下的小部件树:
MyWidget(
color: // 我希望这个颜色在下面的按钮被点击时改变!
child: const SomeChild(
child: AnotherChild(
// 更多更多的小部件...
child: ChildWithTheButton(),
),
),
);
class ChildWithTheButton extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return TextButton(
title: '改变颜色',
onPressed: // 在这里!我希望当按下这个按钮时颜色会改变!
);
}
}
你可以在不同的地方传递类似ChangeNotifier<Color>
的东西,或者传递一个设置状态的回调函数,甚至可以使用InheritedWidget
。另一个选项是使用NotificationListener
。
解决方案
💡 点击这里 查看完整的示例。
定义你的通知:
class ColorNotification extends Notification {
const ColorNotification(this.color);
final Color color;
}
使用NotificationBuilder
来捕获通知:
// MyWidget
NotificationBuilder<ColorNotification>(
builder: (context, notification, child) {
// 注意:在第一次构建时,notification参数将是null。
// 使用一个回退值,如下所示。
final color = notification?.color ?? Colors.white;
return AnimatedContainer(
duration: const Duration(milliseconds: 200),
curve: Curves.fastOutSlowIn,
decoration: BoxDecoration(color: color),
child: child,
);
},
child: const SomeChild(...),
),
从NotificationBuilder
下方的小部件树中触发通知:
onPressed: () {
ColorNotification(color).dispatch(context);
},
结果
如果你不希望某些通知触发重建…
那么你可以使用buildWhen
参数!
buildWhen: (notification) {
// 现在如果传入的颜色是红色,通知将被忽略!
return notification.color != Colors.red,
}
开始使用
pub
在pubspec.yaml
文件中添加包:
dependencies:
notification_builder:
导入
在你的文件中添加依赖项:
import 'package:notification_builder/notification_builder.dart';
完整示例
import 'package:flutter/material.dart';
import 'package:notification_builder/notification_builder.dart';
void main() {
runApp(const App());
}
class App extends StatelessWidget {
const App({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Notification Builder',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: NotificationBuilder<ColorNotification>(
builder: (context, notification, child) {
// 使用一个回退值,如下所示。
final color = notification?.color ?? Colors.white;
return AnimatedContainer(
duration: const Duration(milliseconds: 200),
curve: Curves.fastOutSlowIn,
decoration: BoxDecoration(color: color),
child: child,
);
},
// 注意:对于不依赖于通知的小部件,更高效地使用这个`child`参数。
child: SafeArea(
child: Column(
children: [
const Spacer(),
ColoredBox(
color: Colors.white,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
mainAxisSize: MainAxisSize.min,
children: [
const SizedBox(height: 12.0),
const Text(
'点击以使用Notification Builder更改颜色!',
style: TextStyle(fontSize: 16),
),
const SizedBox(height: 12.0),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
ChangeColorButton(color: Colors.red, title: '红色'),
SizedBox(width: 8.0),
ChangeColorButton(color: Colors.green, title: '绿色'),
SizedBox(width: 8.0),
ChangeColorButton(color: Colors.blue, title: '蓝色'),
],
),
const SizedBox(height: 24.0),
],
),
),
],
),
),
),
);
}
}
class ChangeColorButton extends StatelessWidget {
const ChangeColorButton({
Key? key,
required this.title,
required this.color,
}) : super(key: key);
final String title;
final Color color;
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialButton(
color: Colors.black,
onPressed: () {
ColorNotification(color).dispatch(context);
},
child: Text(
title,
style: const TextStyle(color: Colors.white),
),
);
}
}
class ColorNotification extends Notification {
const ColorNotification(this.color);
final Color color;
}
更多关于Flutter通知构建插件notification_builder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter通知构建插件notification_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用notification_builder
插件来构建通知的示例代码。这个插件允许你以编程方式创建和管理本地通知。
首先,确保你已经在pubspec.yaml
文件中添加了notification_builder
依赖:
dependencies:
flutter:
sdk: flutter
notification_builder: ^latest_version # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter项目中按照以下步骤使用notification_builder
来创建通知。
1. 导入必要的包
在你的Dart文件中导入notification_builder
包:
import 'package:flutter/material.dart';
import 'package:notification_builder/notification_builder.dart';
2. 配置通知权限(可选,但推荐)
在Android和iOS上,你可能需要请求通知权限。这通常在你的应用启动时进行。
void main() {
runApp(MyApp());
// 请求通知权限
_requestNotificationPermissions();
}
Future<void> _requestNotificationPermissions() async {
// 请求权限
await NotificationBuilder.instance.initialize();
// 检查权限状态
NotificationPermission permission = await NotificationBuilder.instance.notificationPermissionState;
if (permission == NotificationPermission.denied) {
// 用户已拒绝权限,可以显示一个对话框引导用户去设置中开启
}
}
3. 创建并显示通知
在你的应用逻辑中创建并显示通知:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Notification Builder Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
_showNotification();
},
child: Text('Show Notification'),
),
),
),
);
}
Future<void> _showNotification() async {
await NotificationBuilder.instance.initialize();
// 创建通知内容
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
'your_channel_id',
'Your Channel Name',
'Your Channel Description',
importance: Importance.max,
priority: Priority.max,
ticker: 'ticker',
showWhen: true,
);
var iOSPlatformChannelSpecifics = IOSNotificationDetails();
var platformChannelSpecifics = NotificationDetails(
android: androidPlatformChannelSpecifics,
iOS: iOSPlatformChannelSpecifics,
);
// 显示通知
await NotificationBuilder.instance.show(
id: 1,
title: 'Hello',
body: 'This is a test notification',
notificationLayout: NotificationLayout.BigPicture,
bigPicture: NetworkImage('https://example.com/path/to/image.jpg'),
payload: 'item x',
channelKeySpecifics: platformChannelSpecifics,
);
}
}
4. 处理通知点击事件
你可以通过NotificationBuilder.instance.notificationClickedStream
来监听通知点击事件:
@override
void initState() {
super.initState();
NotificationBuilder.instance.notificationClickedStream.listen((ReceivedNotification receivedNotification) {
print('Notification clicked: ${receivedNotification.payload}');
// 根据payload处理点击事件
});
}
完整示例
将上述代码片段整合到一个完整的Flutter应用中:
import 'package:flutter/material.dart';
import 'package:notification_builder/notification_builder.dart';
void main() {
runApp(MyApp());
_requestNotificationPermissions();
}
Future<void> _requestNotificationPermissions() async {
await NotificationBuilder.instance.initialize();
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
NotificationBuilder.instance.notificationClickedStream.listen((ReceivedNotification receivedNotification) {
print('Notification clicked: ${receivedNotification.payload}');
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Notification Builder Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
_showNotification();
},
child: Text('Show Notification'),
),
),
),
);
}
Future<void> _showNotification() async {
await NotificationBuilder.instance.initialize();
var androidPlatformChannelSpecifics = AndroidNotificationDetails(
'your_channel_id',
'Your Channel Name',
'Your Channel Description',
importance: Importance.max,
priority: Priority.max,
ticker: 'ticker',
showWhen: true,
);
var iOSPlatformChannelSpecifics = IOSNotificationDetails();
var platformChannelSpecifics = NotificationDetails(
android: androidPlatformChannelSpecifics,
iOS: iOSPlatformChannelSpecifics,
);
await NotificationBuilder.instance.show(
id: 1,
title: 'Hello',
body: 'This is a test notification',
notificationLayout: NotificationLayout.BigPicture,
bigPicture: NetworkImage('https://example.com/path/to/image.jpg'),
payload: 'item x',
channelKeySpecifics: platformChannelSpecifics,
);
}
}
确保你替换了your_channel_id
和https://example.com/path/to/image.jpg
为实际的值。
这样,你就可以在Flutter应用中使用notification_builder
插件来创建和管理本地通知了。