feat: enhance deep link handling for install extensions (#1249)

This commit is contained in:
Levi authored and GitHub committed 2026-01-21 20:23:04 +08:00
1 parent d90af0b9d1
commit af1c8b2719
7 files changed
+77 -51

No files matched your search

@@ -9,6 +9,9 @@ class ExtensionController extends GetxController {
final devMode = false.obs;
var _devModeCount = 0;
/// Flag to prevent handling pending install multiple times
bool pendingInstallHandled = false;
@override
void onInit() async {
super.onInit();
@@ -30,8 +30,34 @@ class ExtensionView extends GetView<ExtensionController> {
final _installUrlController = TextEditingController();
final _installBtnController = IconButtonLoadingController();
Future<void> _doInstall() async {
if (_installUrlController.text.isEmpty) {
controller.tryOpenDevMode();
return;
}
_installBtnController.start();
try {
await installExtension(InstallExtension(url: _installUrlController.text));
Get.snackbar('tip'.tr, 'extensionInstallSuccess'.tr);
await controller.load();
} catch (e) {
showErrorMessage(e);
} finally {
_installBtnController.stop();
}
}
@override
Widget build(BuildContext context) {
// Handle pending install extension from deep link
final args = Get.rootDelegate.arguments();
if (args is InstallExtension && !controller.pendingInstallHandled) {
controller.pendingInstallHandled = true;
_installUrlController.text = args.url;
WidgetsBinding.instance.addPostFrameCallback((_) {
_doInstall();
});
}
return Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -71,23 +97,7 @@ class ExtensionView extends GetView<ExtensionController> {
const SizedBox(width: 10),
IconButtonLoading(
controller: _installBtnController,
onPressed: () async {
if (_installUrlController.text.isEmpty) {
controller.tryOpenDevMode();
return;
}
_installBtnController.start();
try {
await installExtension(InstallExtension(
url: _installUrlController.text));
Get.snackbar('tip'.tr, 'extensionInstallSuccess'.tr);
await controller.load();
} catch (e) {
showErrorMessage(e);
} finally {
_installBtnController.stop();
}
},
onPressed: _doInstall,
icon: const Icon(Icons.download)),
controller.devMode.value && Util.isDesktop()
? IconButton(