huawei_push_plus 1.0.0
huawei_push_plus: ^1.0.0 copied to clipboard
华为推送服务的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),
),
),
);
},
),
),
],
),
);
}
}