Flutter通知构建插件notification_builder的使用

Flutter通知构建插件notification_builder的使用

notification_builder pub version

听力增强:一个通过构建上下文分发的通知来构建的部件。

目录

关于

通知——是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

1 回复

更多关于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_idhttps://example.com/path/to/image.jpg为实际的值。

这样,你就可以在Flutter应用中使用notification_builder插件来创建和管理本地通知了。

回到顶部