push_service_client 0.1.2
push_service_client: ^0.1.2 copied to clipboard
Cliente Flutter para o Push Service — regista devices e recebe push notifications (FCM/APNs).
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:push_service_client/push_service_client.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
// TODO: substituir pelos valores da tua app no Push Service.
final push = PushService(
apiToken: 'SEU_TOKEN_DA_API',
appId: 'slug-da-tua-app',
);
await push.initialize(
country: 'PT',
language: 'pt',
tags: {'app': 'exemplo'},
onOpened: (notification) {
debugPrint('Push aberto: ${notification.title} — ${notification.data}');
},
onReceived: (notification) {
debugPrint('Push recebido: ${notification.title}');
},
);
runApp(PushServiceExampleApp(push: push));
}
class PushServiceExampleApp extends StatefulWidget {
const PushServiceExampleApp({super.key, required this.push});
final PushService push;
@override
State<PushServiceExampleApp> createState() => _PushServiceExampleAppState();
}
class _PushServiceExampleAppState extends State<PushServiceExampleApp> {
String get _status => widget.push.device != null
? 'Device registado!'
: 'A registar...';
Future<void> _sendTestPush() async {
setState(() {});
try {
final push = await widget.push.sendPush(
title: 'Olá do exemplo!',
body: 'Esta notificação foi enviada a partir da app Flutter.',
segment: {'platforms': [widget.push.device!.platform]},
);
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Push enviado (status: ${push.status})')),
);
} catch (e) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Erro ao enviar: $e')),
);
}
}
Future<void> _unsubscribe() async {
final device = widget.push.device;
if (device == null) return;
try {
await widget.push.unsubscribe(device.id);
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('Device desativado (não recebe pushes).')),
);
} catch (e) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Erro: $e')),
);
}
}
@override
Widget build(BuildContext context) {
final device = widget.push.device;
return MaterialApp(
title: 'Push Service Exemplo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(
seedColor: const Color(0xFF576CDB),
brightness: Brightness.light,
),
useMaterial3: true,
),
home: Scaffold(
appBar: AppBar(
title: const Text('Push Service — Exemplo'),
backgroundColor: const Color(0xFF576CDB),
foregroundColor: Colors.white,
),
body: Padding(
padding: const EdgeInsets.all(24),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text('Estado',
style: TextStyle(fontWeight: FontWeight.bold)),
const SizedBox(height: 8),
Text(_status),
if (device != null) ...[
const SizedBox(height: 8),
Text('Player ID: ${device.playerId}'),
Text('Plataforma: ${device.platform}'),
Text('Subscrito: ${device.subscribed}'),
],
],
),
),
),
const SizedBox(height: 16),
FilledButton.icon(
onPressed: device == null ? null : _sendTestPush,
icon: const Icon(Icons.send),
label: const Text('Enviar push de teste'),
),
const SizedBox(height: 8),
OutlinedButton.icon(
onPressed: device == null ? null : _unsubscribe,
icon: const Icon(Icons.notifications_off),
label: const Text('Desativar notificações'),
),
const Spacer(),
const Text(
'Configura o token e o slug da app no ficheiro main.dart '
'para ligar ao teu Push Service. Não te esqueças de adicionar '
'o google-services.json (Android) ou GoogleService-Info.plist (iOS).',
style: TextStyle(fontSize: 12, color: Colors.grey),
),
],
),
),
),
);
}
}