huawei_push_plus 1.0.0 copy "huawei_push_plus: ^1.0.0" to clipboard
huawei_push_plus: ^1.0.0 copied to clipboard

PlatformAndroid

华为推送服务的Flutter插件,专为华为设备设计,提供完整的HMS Push Kit集成,包括原生Badge功能。

example/lib/main.dart

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:huawei_push_plus/huawei_push.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  String _pushToken = 'No token';
  String _aaid = 'No AAID';
  bool _isInitialized = false;
  bool _autoInitEnabled = false;
  int _badgeCount = 0;
  final List<HuaweiPushMessage> _messages = [];
  final List<String> _logs = [];
  late StreamSubscription<HuaweiPushMessage> _messageSubscription;
  late StreamSubscription<HuaweiPushToken> _tokenSubscription;
  late StreamSubscription<HuaweiPushMessage> _clickSubscription;
  late StreamSubscription<int> _badgeSubscription;

  @override
  void initState() {
    super.initState();
    _initializeApp();
    _setupListeners();
  }

  @override
  void dispose() {
    _messageSubscription.cancel();
    _tokenSubscription.cancel();
    _clickSubscription.cancel();
    _badgeSubscription.cancel();
    super.dispose();
  }

  Future<void> _initializeApp() async {
    await _getPlatformVersion();
    await _initializePush();
    await _checkAutoInit();
    await _getInitialMessage();
    await _getBadgeCount();
  }

  void _setupListeners() {
    // 监听推送消息
    _messageSubscription = HuaweiPush.onMessageReceived.listen(
      (HuaweiPushMessage message) {
        _addLog('收到推送消息: ${message.title}');
        setState(() {
          _messages.add(message);
        });
      },
      onError: (error) {
        _addLog('消息监听错误: $error');
      },
    );

    // 监听Token刷新
    _tokenSubscription = HuaweiPush.onTokenRefresh.listen(
      (HuaweiPushToken token) {
        if (token.token.isEmpty) {
          _addLog('收到空Token事件,等待自动获取');
          setState(() {
            _pushToken = '等待Token自动获取...';
          });
        } else {
          _addLog('Token已刷新: ${token.token.substring(0, 20)}...');
          setState(() {
            _pushToken = token.token;
          });
        }
      },
      onError: (error) {
        _addLog('Token监听错误: $error');
      },
    );

    // 监听消息点击
    _clickSubscription = HuaweiPush.onMessageClicked.listen(
      (HuaweiPushMessage message) {
        _addLog('用户点击了推送消息: ${message.title}');
        _showMessageDialog(message);
      },
      onError: (error) {
        _addLog('点击监听错误: $error');
      },
    );

    // 监听badge变化
    _badgeSubscription = HuaweiPush.onBadgeCountChanged.listen(
      (int count) {
        _addLog('badge数量变化: $count');
        setState(() {
          _badgeCount = count;
        });
      },
      onError: (error) {
        _addLog('badge数量变化监听错误: $error');
      },
    );
  }

  void _addLog(String log) {
    setState(() {
      _logs.insert(0, '${DateTime.now().toString().substring(11, 19)}: $log');
      if (_logs.length > 50) {
        _logs.removeLast();
      }
    });
  }

  Future<void> _getPlatformVersion() async {
    try {
      final version = await HuaweiPush.getPlatformVersion() ?? 'Unknown';
      setState(() {
        _platformVersion = version;
      });
    } catch (e) {
      _addLog('获取平台版本失败: $e');
    }
  }

  Future<void> _initializePush() async {
    try {
      final result = await HuaweiPush.initialize();
      setState(() {
        _isInitialized = result;
      });
      _addLog('推送服务初始化: ${result ? '成功' : '失败'}');
      
      if (result) {
        await _getToken();
        await _getAAID();
      }
    } catch (e) {
      _addLog('初始化失败: $e');
    }
  }

  Future<void> _getToken() async {
    try {
      final token = await HuaweiPush.getToken();
      if (token == null || token.isEmpty) {
        setState(() {
          _pushToken = '等待Token自动获取...';
        });
        _addLog('Token为空,等待onNewToken回调(可能是EMUI 10.0以下版本)');
      } else {
        setState(() {
          _pushToken = token;
        });
        _addLog('获取Token成功');
      }
    } catch (e) {
      setState(() {
        _pushToken = 'Failed to get token';
      });
      _addLog('获取Token失败: $e');
    }
  }

  Future<void> _getAAID() async {
    try {
      final aaid = await HuaweiPush.getAAID();
      setState(() {
        _aaid = aaid ?? 'Failed to get AAID';
      });
      _addLog('获取AAID: ${aaid != null ? '成功' : '失败'}');
    } catch (e) {
      _addLog('获取AAID失败: $e');
    }
  }

  Future<void> _checkAutoInit() async {
    try {
      final enabled = await HuaweiPush.isAutoInitEnabled();
      setState(() {
        _autoInitEnabled = enabled;
      });
      _addLog('自动初始化状态: ${enabled ? '启用' : '禁用'}');
    } catch (e) {
      _addLog('检查自动初始化失败: $e');
    }
  }

  Future<void> _toggleAutoInit() async {
    try {
      final newValue = !_autoInitEnabled;
      final result = await HuaweiPush.setAutoInitEnabled(newValue);
      if (result) {
        setState(() {
          _autoInitEnabled = newValue;
        });
        _addLog('自动初始化设置为: ${newValue ? '启用' : '禁用'}');
      } else {
        _addLog('设置自动初始化失败');
      }
    } catch (e) {
      _addLog('设置自动初始化失败: $e');
    }
  }

  Future<void> _subscribeToTopic() async {
    try {
      const topic = 'test_topic';
      final result = await HuaweiPush.subscribe(topic);
      _addLog('订阅主题 "$topic": ${result ? '成功' : '失败'}');
    } catch (e) {
      _addLog('订阅主题失败: $e');
    }
  }

  Future<void> _unsubscribeFromTopic() async {
    try {
      const topic = 'test_topic';
      final result = await HuaweiPush.unsubscribe(topic);
      _addLog('取消订阅主题 "$topic": ${result ? '成功' : '失败'}');
    } catch (e) {
      _addLog('取消订阅主题失败: $e');
    }
  }

  Future<void> _createNotificationChannel() async {
    try {
      final result = await HuaweiPush.createNotificationChannel(
        channelId: 'default_channel',
        channelName: '默认通知渠道',
        channelDescription: '用于接收推送通知的默认渠道',
        importance: 4, // IMPORTANCE_HIGH
        enableLights: true,
        enableVibration: true,
      );
      _addLog('创建通知渠道: ${result ? '成功' : '失败'}');
    } catch (e) {
      _addLog('创建通知渠道失败: $e');
    }
  }

  Future<void> _getInitialMessage() async {
    try {
      final message = await HuaweiPush.getInitialMessage();
      if (message != null) {
        _addLog('获取到初始消息: ${message.title}');
        _showMessageDialog(message);
      } else {
        _addLog('没有初始消息');
      }
    } catch (e) {
      _addLog('获取初始消息失败: $e');
    }
  }

  Future<void> _deleteToken() async {
    try {
      final result = await HuaweiPush.deleteToken();
      _addLog('删除Token: ${result ? '成功' : '失败'}');
      if (result) {
        setState(() {
          _pushToken = 'Token已删除';
        });
      }
    } catch (e) {
      _addLog('删除Token失败: $e');
    }
  }

  Future<void> _forceRefreshToken() async {
    try {
      _addLog('开始强制刷新Token...');
      
      // 第一步:删除当前Token
      final deleteResult = await HuaweiPush.deleteToken();
      _addLog('删除Token: ${deleteResult ? '成功' : '失败'}');
      
      if (deleteResult) {
        setState(() {
          _pushToken = '正在刷新Token...';
        });
        
        // 等待一秒钟确保删除操作完成
        await Future.delayed(const Duration(seconds: 1));
        
        // 第二步:重新获取Token
        final token = await HuaweiPush.getToken();
        if (token == null || token.isEmpty) {
          setState(() {
            _pushToken = '等待Token自动获取...';
          });
          _addLog('Token刷新后为空,等待onNewToken回调');
        } else {
          setState(() {
            _pushToken = token;
          });
          _addLog('Token刷新成功');
        }
      } else {
        _addLog('Token删除失败,无法继续刷新');
      }
    } catch (e) {
      setState(() {
        _pushToken = 'Token刷新失败';
      });
      _addLog('强制刷新Token失败: $e');
    }
  }

  // Badge管理方法
  Future<void> _getBadgeCount() async {
    try {
      final count = await HuaweiPush.getBadgeCount();
      setState(() {
        _badgeCount = count;
      });
      _addLog('当前badge数量: $count');
    } catch (e) {
      _addLog('获取badge数量失败: $e');
    }
  }

  Future<void> _setBadgeCount() async {
    try {
      final count = _badgeCount + 1;
      final success = await HuaweiPush.setBadgeCount(count);
      if (success) {
        setState(() {
          _badgeCount = count;
        });
        _addLog('设置badge数量成功: $count');
      } else {
        _addLog('设置badge数量失败');
      }
    } catch (e) {
      _addLog('设置badge数量失败: $e');
    }
  }

  Future<void> _incrementBadgeCount() async {
    try {
      final newCount = await HuaweiPush.incrementBadgeCount(increment: 1);
      setState(() {
        _badgeCount = newCount;
      });
      _addLog('增加badge数量成功: $newCount');
    } catch (e) {
      _addLog('增加badge数量失败: $e');
    }
  }

  Future<void> _decrementBadgeCount() async {
    try {
      final newCount = await HuaweiPush.decrementBadgeCount(decrement: 1);
      setState(() {
        _badgeCount = newCount;
      });
      _addLog('减少badge数量成功: $newCount');
    } catch (e) {
      _addLog('减少badge数量失败: $e');
    }
  }

  Future<void> _clearBadge() async {
    try {
      final success = await HuaweiPush.clearBadge();
      if (success) {
        setState(() {
          _badgeCount = 0;
        });
        _addLog('清除badge成功');
      } else {
        _addLog('清除badge失败');
      }
    } catch (e) {
      _addLog('清除badge失败: $e');
    }
  }

  void _showMessageDialog(HuaweiPushMessage message) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text(message.title ?? '推送消息'),
          content: Column(
            mainAxisSize: MainAxisSize.min,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              if (message.body != null) Text('内容: ${message.body}'),
              if (message.messageId != null) Text('消息ID: ${message.messageId}'),
              if (message.data != null) Text('数据: ${message.data}'),
            ],
          ),
          actions: [
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: const Text('确定'),
            ),
          ],
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: '华为推送示例',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        useMaterial3: true,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('华为推送示例'),
          backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        ),
        body: DefaultTabController(
          length: 3,
          child: Column(
            children: [
              const TabBar(
                tabs: [
                  Tab(text: '状态'),
                  Tab(text: '操作'),
                  Tab(text: '日志'),
                ],
              ),
              Expanded(
                child: TabBarView(
                  children: [
                    _buildStatusTab(),
                    _buildActionsTab(),
                    _buildLogsTab(),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Widget _buildStatusTab() {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          _buildStatusCard('平台版本', _platformVersion),
          _buildStatusCard('初始化状态', _isInitialized ? '已初始化' : '未初始化'),
          _buildStatusCard('自动初始化', _autoInitEnabled ? '启用' : '禁用'),
          _buildStatusCard('推送Token', _pushToken, isExpandable: true),
          _buildStatusCard('AAID', _aaid, isExpandable: true),
          _buildStatusCard('Badge数量', '$_badgeCount'),
          _buildStatusCard('接收消息数', '${_messages.length}'),
        ],
      ),
    );
  }

  Widget _buildStatusCard(String title, String value, {bool isExpandable = false}) {
    return Card(
      margin: const EdgeInsets.only(bottom: 8.0),
      child: Padding(
        padding: const EdgeInsets.all(12.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              title,
              style: const TextStyle(fontWeight: FontWeight.bold),
            ),
            const SizedBox(height: 4),
            isExpandable
                ? ExpansionTile(
                    title: Text(
                      value.length > 50 ? '${value.substring(0, 50)}...' : value,
                      style: const TextStyle(fontSize: 12),
                    ),
                    children: [
                      Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: SelectableText(
                          value,
                          style: const TextStyle(fontSize: 12),
                        ),
                      ),
                    ],
                  )
                : Text(
                    value,
                    style: const TextStyle(fontSize: 12),
                  ),
          ],
        ),
      ),
    );
  }

  Widget _buildActionsTab() {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [
          _buildActionButton('重新获取Token', _getToken),
          _buildActionButton('删除Token', _deleteToken),
          _buildActionButton('强制刷新Token', _forceRefreshToken),
          const Divider(),
          _buildActionButton('切换自动初始化', _toggleAutoInit),
          _buildActionButton('订阅测试主题', _subscribeToTopic),
          _buildActionButton('取消订阅测试主题', _unsubscribeFromTopic),
          _buildActionButton('创建通知渠道', _createNotificationChannel),
          _buildActionButton('获取初始消息', _getInitialMessage),
          const Divider(),
          _buildActionButton('获取Badge数量', _getBadgeCount),
          _buildActionButton('设置Badge数量', _setBadgeCount),
          _buildActionButton('增加Badge数量', _incrementBadgeCount),
          _buildActionButton('减少Badge数量', _decrementBadgeCount),
          _buildActionButton('清除Badge', _clearBadge),
        ],
      ),
    );
  }

  Widget _buildActionButton(String text, VoidCallback onPressed) {
    return Container(
      width: double.infinity,
      margin: const EdgeInsets.only(bottom: 8.0),
      child: ElevatedButton(
        onPressed: onPressed,
        child: Text(text),
      ),
    );
  }

  Widget _buildLogsTab() {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              const Text(
                '操作日志',
                style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
              ),
              TextButton(
                onPressed: () {
                  setState(() {
                    _logs.clear();
                  });
                },
                child: const Text('清空'),
              ),
            ],
          ),
          Expanded(
            child: _logs.isEmpty
                ? const Center(child: Text('暂无日志'))
                : ListView.builder(
                    itemCount: _logs.length,
                    itemBuilder: (context, index) {
                      return Card(
                        margin: const EdgeInsets.only(bottom: 4.0),
                        child: Padding(
                          padding: const EdgeInsets.all(8.0),
                          child: Text(
                            _logs[index],
                            style: const TextStyle(fontSize: 12),
                          ),
                        ),
                      );
                    },
                  ),
          ),
        ],
      ),
    );
  }
}
0
likes
135
points
35
downloads

Publisher

unverified uploader

Weekly Downloads

华为推送服务的Flutter插件,专为华为设备设计,提供完整的HMS Push Kit集成,包括原生Badge功能。

Repository (GitHub)
View/report issues

Documentation

API reference

License

MIT (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on huawei_push_plus

Packages that implement huawei_push_plus