flutter_netbird 1.0.2
flutter_netbird: ^1.0.2 copied to clipboard
A Flutter FFI plugin for NetBird mesh VPN, providing secure peer-to-peer connectivity, DNS resolution, and HTTP proxy across Android, iOS, macOS, Windows, and Linux.
example/lib/main.dart
/// NetBird Flutter Demo 应用入口
///
/// 仅包含应用框架和 Tab 导航,所有页面逻辑已提取到 screens/ 目录
library;
import 'dart:async';
import 'package:flutter/material.dart';
import 'models/app_state.dart';
import 'screens/home_screen.dart';
import 'screens/http_test_screen.dart';
import 'screens/logs_screen.dart';
import 'screens/peers_screen.dart';
import 'screens/settings_screen.dart';
import 'screens/websocket_test_screen.dart';
import 'services/netbird_service.dart';
import 'utils/constants.dart';
void main() {
runApp(const MaterialApp(home: NetbirdDemoApp()));
}
class NetbirdDemoApp extends StatefulWidget {
const NetbirdDemoApp({super.key});
@override
State<NetbirdDemoApp> createState() => _NetbirdDemoAppState();
}
class _NetbirdDemoAppState extends State<NetbirdDemoApp> {
final _service = NetbirdService();
// 文本输入控制器
final _setupKeyController = TextEditingController(
text: "F1A98F6B-3C5F-4511-8981-12C1D4CB4F24",
);
final _managementUrlController = TextEditingController(
text: AppConstants.defaultManagementUrl,
);
final _deviceNameController = TextEditingController(
text: AppConstants.defaultDeviceName,
);
final _httpTestUrlController = TextEditingController(
text: "http://100.83.33.144:8080/api/test",
);
// 流订阅
StreamSubscription<AppState>? _stateSub;
StreamSubscription<ServiceMessage>? _messageSub;
@override
void initState() {
super.initState();
_setupServiceListeners();
_service.setupListeners();
_service.initialize(
managementUrl: _managementUrlController.text,
deviceName: _deviceNameController.text,
);
}
/// 设置服务流监听:状态变化触发 UI 重建,消息通知显示 SnackBar
void _setupServiceListeners() {
_stateSub = _service.stateStream.listen((_) {
if (mounted) setState(() {});
});
_messageSub = _service.messageStream.listen((msg) {
if (!mounted) return;
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(msg.text),
backgroundColor: _getMessageColor(msg.type),
duration: const Duration(seconds: 3),
),
);
});
}
Color _getMessageColor(ServiceMessageType type) {
return switch (type) {
ServiceMessageType.info => Colors.blue,
ServiceMessageType.success => Colors.green,
ServiceMessageType.warning => Colors.orange,
ServiceMessageType.error => Colors.red,
};
}
@override
void dispose() {
_stateSub?.cancel();
_messageSub?.cancel();
_service.dispose();
super.dispose();
}
/// 连接到 NetBird 网络(如果 SDK 未初始化则自动重新初始化)
Future<void> _connect() async {
if (!_service.isInitialized) {
await _service.reinitialize(
managementUrl: _managementUrlController.text,
deviceName: _deviceNameController.text,
);
if (!_service.isInitialized) return;
}
await _service.connect(setupKey: _setupKeyController.text.trim());
}
@override
Widget build(BuildContext context) {
return DefaultTabController(
length: 6,
child: Scaffold(
appBar: AppBar(
title: const Text('NetBird Flutter Demo'),
bottom: const TabBar(
isScrollable: true,
tabs: [
Tab(icon: Icon(Icons.home), text: 'Home'),
Tab(icon: Icon(Icons.people), text: 'Peers'),
Tab(icon: Icon(Icons.http), text: 'HTTP Test'),
Tab(icon: Icon(Icons.chat_bubble_outline), text: 'WS Test'),
Tab(icon: Icon(Icons.list_alt), text: 'Logs'),
Tab(icon: Icon(Icons.settings), text: 'Settings'),
],
),
),
body: TabBarView(
children: [
HomeScreen(
service: _service,
setupKeyController: _setupKeyController,
managementUrlController: _managementUrlController,
onConnect: _connect,
onDisconnect: _service.disconnect,
),
PeersScreen(service: _service),
HttpTestScreen(
service: _service,
urlController: _httpTestUrlController,
),
WebSocketTestScreen(service: _service),
LogsScreen(service: _service),
SettingsScreen(
service: _service,
managementUrlController: _managementUrlController,
deviceNameController: _deviceNameController,
),
],
),
),
);
}
}