You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用OneSignal API定时发通知、点击容器触发及SDK初始化问询

Flutter 实现点击容器触发 OneSignal 通知推送

1. 配置依赖

首先在pubspec.yaml中添加所需依赖:

dependencies:
  flutter:
    sdk: flutter
  onesignal_flutter: ^5.0.0 # 建议使用最新稳定版本
  http: ^1.1.0 # 用于调用 OneSignal REST API

执行flutter pub get完成依赖安装。

2. OneSignal SDK 初始化代码

在应用启动时完成 SDK 初始化,示例如下:

import 'package:flutter/material.dart';
import 'package:onesignal_flutter/onesignal_flutter.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 替换为你的 OneSignal 应用 ID
  await OneSignal.initialize("YOUR_ONESIGNAL_APP_ID");
  
  // 请求用户通知权限
  OneSignal.Notifications.requestPermission(true);
  
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: const HomePage(),
    );
  }
}

3. 点击容器触发推送的实现

以下是包含完整逻辑的页面代码,点击蓝色容器即可触发通知推送:

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

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String? _currentPlayerId;

  @override
  void initState() {
    super.initState();
    // 获取当前设备的 Player ID
    _getCurrentPlayerId();
  }

  Future<void> _getCurrentPlayerId() async {
    final deviceState = await OneSignal.User.getDeviceState();
    setState(() {
      _currentPlayerId = deviceState?.userId;
    });
  }

  // 调用 OneSignal API 发送通知
  Future<void> _sendNotification() async {
    if (_currentPlayerId == null) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text("未获取到用户标识,无法发送通知")),
      );
      return;
    }

    // 替换为你的 OneSignal REST API Key 和应用 ID
    const apiKey = "YOUR_ONESIGNAL_REST_API_KEY";
    const appId = "YOUR_ONESIGNAL_APP_ID";

    final url = Uri.parse("https://onesignal.com/api/v1/notifications");
    final headers = {
      "Content-Type": "application/json",
      "Authorization": "Basic $apiKey",
    };

    final requestBody = jsonEncode({
      "app_id": appId,
      "include_player_ids": [_currentPlayerId!],
      "contents": {"en": "测试通知内容"},
      "headings": {"en": "测试通知"},
    });

    final response = await http.post(url, headers: headers, body: requestBody);

    if (response.statusCode == 200) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text("通知发送成功")),
      );
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("发送失败: ${response.body}")),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("OneSignal 通知测试")),
      body: Center(
        child: GestureDetector(
          onTap: _sendNotification,
          child: Container(
            width: 220,
            height: 110,
            decoration: BoxDecoration(
              color: Colors.blueAccent,
              borderRadius: BorderRadius.circular(12),
            ),
            alignment: Alignment.center,
            child: const Text(
              "点击发送通知",
              style: TextStyle(color: Colors.white, fontSize: 19),
            ),
          ),
        ),
      ),
    );
  }
}

关键注意事项

  • 凭证获取:YOUR_ONESIGNAL_APP_ID和YOUR_ONESIGNAL_REST_API_KEY需从 OneSignal 控制台的设置 > 密钥与ID页面获取。
  • 平台配置:Android 需配置 Firebase 服务,iOS 需上传推送证书,具体步骤参考 OneSignal 对应平台的配置指引。
  • Player ID:若需向其他用户发送通知,只需将include_player_ids数组中的值替换为目标用户的 Player ID 即可。

内容的提问来源于stack exchange,提问作者user23648464

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 23:21:16