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 { String? _configFilePath; String _status = '未选择配置文件'; Future _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 _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: [ 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: [ 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: [ 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), ), ), ], ), ), ); } }