Files
proxypin/lib/ui/launch/launch.dart
2023-10-19 01:36:03 +08:00

124 lines
3.0 KiB
Dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_toastr/flutter_toastr.dart';
import 'package:network_proxy/network/bin/server.dart';
import 'package:network_proxy/utils/platform.dart';
import 'package:window_manager/window_manager.dart';
class SocketLaunch extends StatefulWidget {
final ProxyServer proxyServer;
final int size;
final bool startup;
final Function? onStart;
final Function? onStop;
final bool serverLaunch;
const SocketLaunch(
{super.key,
required this.proxyServer,
this.size = 25,
this.onStart,
this.onStop,
this.startup = true,
this.serverLaunch = true});
@override
State<StatefulWidget> createState() {
return _SocketLaunchState();
}
}
class _SocketLaunchState extends State<SocketLaunch> with WindowListener, WidgetsBindingObserver {
bool started = false;
@override
void initState() {
super.initState();
windowManager.addListener(this);
WidgetsBinding.instance.addObserver(this);
//启动代理服务器
if (widget.startup) {
start();
}
if (Platforms.isDesktop()) {
windowManager.setPreventClose(true);
}
}
@override
void dispose() {
windowManager.removeListener(this);
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void onWindowClose() async {
await widget.proxyServer.stop();
print("onWindowClose");
started = false;
await windowManager.destroy();
exit(0);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.detached) {
print('AppLifecycleState.detached');
widget.onStop?.call();
widget.proxyServer.stop();
started = false;
}
}
@override
Widget build(BuildContext context) {
return IconButton(
tooltip: started ? "停止" : "启动",
icon: Icon(started ? Icons.stop : Icons.play_arrow_sharp,
color: started ? Colors.red : Colors.green, size: widget.size.toDouble()),
onPressed: () async {
if (started) {
if (!widget.serverLaunch) {
setState(() {
widget.onStop?.call();
started = !started;
});
return;
}
widget.proxyServer.stop().then((value) {
widget.onStop?.call();
setState(() {
started = !started;
});
});
} else {
start();
}
});
}
///启动代理服务器
start() {
if (!widget.serverLaunch) {
setState(() {
widget.onStart?.call();
started = true;
});
return;
}
widget.proxyServer.start().then((value) {
setState(() {
started = true;
});
widget.onStart?.call();
}).catchError((e) {
FlutterToastr.show("启动失败,请检查端口号${widget.proxyServer.port}是否被占用", context, duration: 3);
});
}
}