first commit
This commit is contained in:
163
lib/main.dart
Normal file
163
lib/main.dart
Normal file
@ -0,0 +1,163 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:process_run/shell.dart';
|
||||
import 'dart:io';
|
||||
|
||||
void main() {
|
||||
runApp(NaiveProxyApp());
|
||||
}
|
||||
|
||||
class NaiveProxyApp extends StatelessWidget {
|
||||
const NaiveProxyApp({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return MaterialApp(
|
||||
title: 'NaiveProxy启动器',
|
||||
theme: ThemeData(
|
||||
primarySwatch: Colors.blue,
|
||||
visualDensity: VisualDensity.adaptivePlatformDensity,
|
||||
),
|
||||
home: NaiveProxyHomePage(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class NaiveProxyHomePage extends StatefulWidget {
|
||||
const NaiveProxyHomePage({super.key});
|
||||
|
||||
@override
|
||||
_NaiveProxyHomePageState createState() => _NaiveProxyHomePageState();
|
||||
}
|
||||
|
||||
class _NaiveProxyHomePageState extends State<NaiveProxyHomePage> {
|
||||
String? _configFilePath;
|
||||
String _status = '未选择配置文件';
|
||||
|
||||
Future<void> _pickConfigFile() async {
|
||||
FilePickerResult? result = await FilePicker.platform.pickFiles(
|
||||
type: FileType.custom,
|
||||
allowedExtensions: ['json'],
|
||||
);
|
||||
|
||||
if (result != null) {
|
||||
setState(() {
|
||||
_configFilePath = result.files.single.path;
|
||||
_status = '已选择文件: ${_configFilePath!.split('/').last}';
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _launchNaiveProxy() async {
|
||||
if (_configFilePath == null) {
|
||||
_showErrorDialog('请先导入配置文件');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// 检查naiveproxy是否已安装
|
||||
var shell = Shell();
|
||||
var whichResult = await shell.run('which naive');
|
||||
|
||||
if (whichResult.isEmpty) {
|
||||
_showErrorDialog('NaiveProxy未安装');
|
||||
return;
|
||||
}
|
||||
|
||||
// 尝试执行naive
|
||||
var result = await shell.run('naive $_configFilePath');
|
||||
|
||||
// 显示执行结果
|
||||
_showResultDialog('NaiveProxy已启动', result.outText);
|
||||
|
||||
} catch (e) {
|
||||
_showErrorDialog('启动失败:${e.toString()}');
|
||||
}
|
||||
}
|
||||
|
||||
void _showErrorDialog(String message) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text('错误'),
|
||||
content: Text(message),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: Text('确定'),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
void _showResultDialog(String title, String message) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return AlertDialog(
|
||||
title: Text(title),
|
||||
content: SingleChildScrollView(
|
||||
child: Text(message),
|
||||
),
|
||||
actions: <Widget>[
|
||||
TextButton(
|
||||
child: Text('确定'),
|
||||
onPressed: () {
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text('NaiveProxy启动器'),
|
||||
centerTitle: true,
|
||||
),
|
||||
body: Center(
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
SizedBox(
|
||||
width: 300,
|
||||
child: Text(
|
||||
_status,
|
||||
style: TextStyle(fontSize: 16),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
ElevatedButton.icon(
|
||||
icon: Icon(Icons.file_upload),
|
||||
label: Text('导入配置文件'),
|
||||
onPressed: _pickConfigFile,
|
||||
style: ElevatedButton.styleFrom(
|
||||
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 12),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 20),
|
||||
ElevatedButton.icon(
|
||||
icon: Icon(Icons.rocket_launch),
|
||||
label: Text('启动NaiveProxy'),
|
||||
onPressed: _launchNaiveProxy,
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: Colors.green,
|
||||
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 12),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user