stopou_blocker 0.0.2
stopou_blocker: ^0.0.2 copied to clipboard
Plugin do Stopou para bloqueio por VPN local (preparado para estratégias futuras).
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:stopou_blocker/stopou_blocker.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Stopou Blocker Demo',
theme: ThemeData(useMaterial3: true),
home: const DemoPage(),
);
}
}
class DemoPage extends StatefulWidget {
const DemoPage({super.key});
@override
State<DemoPage> createState() => _DemoPageState();
}
class _DemoPageState extends State<DemoPage> {
final _log = <String>[];
@override
void initState() {
super.initState();
// ✅ Assina o stream de eventos do plugin.
// Quando o serviço emitir um evento (bloqueio ou teste),
// adicionamos uma linha no log (ListView).
StopouBlocker.events.listen((e) {
setState(() {
_log.add(
"${e.ts.toIso8601String()} ${e.protocol.padRight(5)} ${e.host} ${e.appPackage ?? ''}",
);
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Stopou VPN Local')),
body: Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
// 1) Pede permissão de uso de VPN ao usuário
ElevatedButton(
onPressed: () async {
final ok = await StopouBlocker.requestPermission();
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Permissão VPN: $ok')),
);
},
child: const Text('1) Pedir permissão VPN'),
),
const SizedBox(height: 8),
// 2) Inicia o serviço de VPN com a blocklist padrão (*.bet.br)
ElevatedButton(
onPressed: () async {
await StopouBlocker.start(
blocklist: const ['*.bet.br'],
// estratégias futuras já previstas; hoje só VPN
strategies: const ['VPN'],
logAttempts: true,
);
},
child: const Text('2) Iniciar VPN local'),
),
const SizedBox(height: 8),
// 3) Para o serviço
ElevatedButton(
onPressed: () async {
await StopouBlocker.stop();
},
child: const Text('3) Parar'),
),
const Divider(height: 24),
const Align(
alignment: Alignment.centerLeft,
child: Text('Eventos recebidos:', style: TextStyle(fontWeight: FontWeight.bold)),
),
const SizedBox(height: 8),
Expanded(
child: ListView.builder(
itemCount: _log.length,
itemBuilder: (_, i) => Text(_log[i]),
),
),
],
),
),
);
}
}