Skip to content

Commit ddb84e7

Browse files
committed
实现启动App携带文件参数
1 parent ec59cca commit ddb84e7

5 files changed

Lines changed: 106 additions & 28 deletions

File tree

assets/open_with.reg

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Windows Registry Editor Version 5.00
2+
3+
[HKEY_CLASSES_ROOT\*\shell\OpenWithADBTools]
4+
@="ʹÓà ADBTools ´ò¿ª"
5+
6+
[HKEY_CLASSES_ROOT\*\shell\OpenWithADBTools\command]
7+
@="\"D:\src\ADBTools\ADBTools.exe\" \"%1\""

lib/main.dart

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,66 @@
1+
import 'dart:async';
2+
import 'dart:convert';
3+
import 'dart:io';
4+
import 'dart:typed_data';
5+
6+
import 'package:adb_tools/providers/app_provider.dart';
17
import 'package:adb_tools/utils/setup.dart';
8+
import 'package:cross_file/cross_file.dart';
29
import 'package:flutter/material.dart';
310
import 'package:flutter_riverpod/flutter_riverpod.dart';
411
import 'package:window_manager/window_manager.dart';
512

613
import 'pages/main_page.dart';
714

8-
Future<void> main() async {
15+
const int port = 6666;
16+
17+
Future<void> main(List<String> args) async {
18+
bool isServer = false;
19+
ServerSocket? server;
20+
WidgetRef? widgetRef;
21+
22+
try {
23+
// 尝试建立Socket服务器(第一个实例)
24+
server = await ServerSocket.bind(InternetAddress.loopbackIPv4, port);
25+
isServer = true;
26+
27+
print("Socket 服务已启动,等待文件路径...");
28+
server.listen((client) {
29+
print("收到连接: ${client.remoteAddress.address}:${client.remotePort}");
30+
client.transform(StreamTransformer.fromHandlers(
31+
handleData: (Uint8List data, EventSink<String> sink) {
32+
sink.add(utf8.decode(data));
33+
},
34+
)).listen((data) {
35+
print("收到文件路径: $data");
36+
// TODO: 在这里处理接收到的文件路径,比如将文件保存到filesProvider中
37+
if (widgetRef == null) return;
38+
var xfile = XFile(data);
39+
widgetRef?.read(filesProvider.notifier).state = [...widgetRef?.read(filesProvider.notifier).state ?? [], xfile];
40+
});
41+
});
42+
} catch (e) {
43+
isServer = false;
44+
}
45+
46+
if (!isServer) {
47+
// 如果不是Server,说明已有实例在运行 → 把参数传过去
48+
if (args.isNotEmpty) {
49+
final filePath = args[0];
50+
try {
51+
final socket = await Socket.connect(InternetAddress.loopbackIPv4, port);
52+
socket.write(filePath);
53+
await socket.flush();
54+
await socket.close();
55+
print("已将文件路径传给主实例: $filePath");
56+
} catch (e) {
57+
print("发送文件路径失败: $e");
58+
}
59+
}
60+
// 退出自己
61+
exit(0);
62+
}
63+
964
// Try to resize and reposition the window to be half the width and height
1065
// of its screen, centered horizontally and shifted up from center.
1166
WidgetsFlutterBinding.ensureInitialized();
@@ -24,7 +79,12 @@ Future<void> main() async {
2479
await windowManager.focus();
2580
});
2681

27-
runApp(const ProviderScope(child: MainApp()));
82+
runApp(ProviderScope(child: Consumer(
83+
builder: (context, ref, child) {
84+
widgetRef = ref;
85+
return const MainApp();
86+
},
87+
)));
2888
}
2989

3090
class MainApp extends ConsumerStatefulWidget {

lib/pages/man_page/left_side/apk_drop_target.dart

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'package:adb_tools/providers/app_provider.dart';
12
import 'package:adb_tools/utils/dialog_utils.dart';
23
import 'package:cross_file/cross_file.dart';
34
import 'package:desktop_drop/desktop_drop.dart';
@@ -18,15 +19,35 @@ class ApkDragTarget extends ConsumerStatefulWidget {
1819

1920
class _ApkDragTargetState extends ConsumerState<ApkDragTarget> {
2021
bool _dragging = false;
21-
final List<XFile> list = [];
22+
23+
void _onDropDone(DropDoneDetails details) async {
24+
var list = ref.read(filesProvider);
25+
var files = details.files.where((file) {
26+
return !list.any((item) {
27+
return item.path == file.path;
28+
});
29+
}).toList();
30+
if (files.isEmpty) {
31+
DialogUtils.showInfoDialog(
32+
context,
33+
"No new APK files were dropped",
34+
"You can only drop APK files that are not already selected",
35+
);
36+
return;
37+
}
38+
ref.read(filesProvider.notifier).state = [
39+
...ref.read(filesProvider),
40+
...files
41+
];
42+
}
2243

2344
// start shizuku
2445
Future<void> _toggleStartShizuku() async {
2546
var serialNumber = ref.read(selectedDeviceProvider)!.serialNumber;
2647
var info = await ADBUtils.getShizukuPackageInfo(serialNumber);
27-
if(int.parse(info.versionCode) < 1086){
48+
if (int.parse(info.versionCode) < 1086) {
2849
ADBUtils.startShizuku(serialNumber);
29-
return ;
50+
return;
3051
}
3152

3253
ADBUtils.startShizuku2(serialNumber, info);
@@ -35,51 +56,35 @@ class _ApkDragTargetState extends ConsumerState<ApkDragTarget> {
3556
// start brevent
3657
Future<void> _toggleStartBrevent() async {
3758
var serialNumber = ref.read(selectedDeviceProvider)!.serialNumber;
38-
ADBUtils.startBrevent(serialNumber);
59+
ADBUtils.startBrevent(serialNumber);
3960
}
4061

4162
// install apk to device
4263
void _toggleInstall() {
64+
var list = ref.read(filesProvider);
4365
ADBUtils.install(ref.read(selectedDeviceProvider), list);
4466
}
4567

4668
// push files to device
4769
void _togglePushFiles() {
70+
var list = ref.read(filesProvider);
4871
ADBUtils.push(ref.read(selectedDeviceProvider), list);
4972
}
5073

5174
// clear all files
5275
void _toggleClearAll() {
53-
setState(() {
54-
list.clear();
55-
});
76+
ref.read(filesProvider.notifier).state = [];
5677
}
5778

5879
@override
5980
Widget build(BuildContext context) {
6081
var selectedDevice = ref.watch(selectedDeviceProvider);
6182
var isSelectedDevice = (selectedDevice != null);
83+
var list = ref.watch(filesProvider);
6284
var isSelectedDeviceAndFiles = (selectedDevice != null && list.isNotEmpty);
6385

6486
return DropTarget(
65-
onDragDone: (detail) {
66-
var files = detail.files.where((file) {
67-
return !list.any((item) {
68-
return item.path == file.path;
69-
});
70-
}).toList();
71-
if (files.isEmpty) {
72-
DialogUtils.showInfoDialog(
73-
context,
74-
"No new APK files were dropped",
75-
"You can only drop APK files that are not already selected",
76-
);
77-
return;
78-
}
79-
setState(() {
80-
list.addAll(files);
81-
});
82-
},
87+
onDragDone: _onDropDone,
8388
onDragEntered: (detail) {
8489
setState(() {
8590
_dragging = true;

lib/providers/app_provider.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
import 'package:cross_file/cross_file.dart';
12
import 'package:flutter_riverpod/flutter_riverpod.dart';
23

34
final execDirProvider = StateProvider((ref) => '');
45

56
String workDir = '';
7+
8+
9+
final filesProvider = StateProvider<List<XFile>>((ref) => []);

lib/providers/device_list_provider.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,9 @@ void refreshDeviceList(WidgetRef ref, {bool printOutput = true}) async {
100100
}
101101

102102
void _updateDbDevices(
103-
WidgetRef ref, List<DeviceInfo> tempConnectedDevices) async {
103+
WidgetRef ref,
104+
List<DeviceInfo> tempConnectedDevices,
105+
) async {
104106
if (tempConnectedDevices.isEmpty) return;
105107
var dbDevices = await Db.getSavedAdbDevice();
106108
bool needUpdate = false;

0 commit comments

Comments
 (0)