import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'dart:isolate'; import 'package:fl_clash/models/models.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; class App { static App? _instance; MethodChannel? methodChannel; Function()? onExit; App._internal() { if (Platform.isAndroid) { methodChannel = const MethodChannel("app"); methodChannel!.setMethodCallHandler((call) async { switch (call.method) { case "exit": if (onExit != null) { await onExit!(); } break; default: throw MissingPluginException(); } }); } } setOnExit(Function() onExit) { this.onExit = onExit; } factory App() { _instance ??= App._internal(); return _instance!; } Future moveTaskToBack() async { return await methodChannel?.invokeMethod("moveTaskToBack"); } Future> getPackages() async { final packagesString = await methodChannel?.invokeMethod("getPackages"); return Isolate.run>(() { final List packagesRaw = packagesString != null ? json.decode(packagesString) : []; return packagesRaw.map((e) => Package.fromJson(e)).toList(); }); } Future getPackageIcon(String packageName) async { final base64 = await methodChannel?.invokeMethod("getPackageIcon", { "packageName": packageName, }); if (base64 == null) { return null; } return MemoryImage(base64Decode(base64)); } Future tip(String? message) async { return await methodChannel?.invokeMethod("tip", { "message": "$message", }); } Future getPackageName(Metadata metadata) async { return await methodChannel?.invokeMethod("getPackageName", { "data": json.encode(metadata), }); } } final app = Platform.isAndroid ? App() : null;