2024-04-30 23:38:49 +08:00
|
|
|
import 'dart:async';
|
2024-07-15 22:06:09 +08:00
|
|
|
import 'dart:io';
|
2024-04-30 23:38:49 +08:00
|
|
|
|
2026-09-05 20:09:39 +08:00
|
|
|
import 'package:fl_clash/enum/enum.dart';
|
2025-12-16 11:23:09 +08:00
|
|
|
import 'package:fl_clash/pages/error.dart';
|
2026-09-05 20:09:39 +08:00
|
|
|
import 'package:material_ui/material_ui.dart';
|
2025-02-09 18:39:38 +08:00
|
|
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
2026-02-02 10:14:13 +08:00
|
|
|
import 'package:rust_api/rust_api.dart';
|
2026-10-08 17:58:43 +08:00
|
|
|
import 'package:shared_preferences_platform_interface/shared_preferences_platform_interface.dart';
|
2024-12-03 21:47:12 +08:00
|
|
|
|
2024-04-30 23:38:49 +08:00
|
|
|
import 'application.dart';
|
2026-09-05 20:09:39 +08:00
|
|
|
import 'bootstrap.dart';
|
2026-10-08 17:58:43 +08:00
|
|
|
import 'common/app_data.dart';
|
2024-12-03 21:47:12 +08:00
|
|
|
import 'common/common.dart';
|
2026-10-08 17:58:43 +08:00
|
|
|
import 'common/preferences_store.dart';
|
2026-09-05 20:09:39 +08:00
|
|
|
import 'common/window.dart';
|
2024-04-30 23:38:49 +08:00
|
|
|
|
2026-09-05 20:09:39 +08:00
|
|
|
void main(List<String> args) {
|
|
|
|
|
runZonedGuarded(
|
|
|
|
|
() async {
|
|
|
|
|
WidgetsFlutterBinding.ensureInitialized();
|
2026-10-08 17:58:43 +08:00
|
|
|
if (Platform.isWindows || Platform.isLinux) {
|
|
|
|
|
SharedPreferencesStorePlatform.instance = AtomicFilePreferencesStore(
|
|
|
|
|
appPath.sharedPreferencesPath,
|
|
|
|
|
);
|
|
|
|
|
}
|
2026-09-05 20:09:39 +08:00
|
|
|
if (Platform.isLinux) {
|
|
|
|
|
linkManager.seedInitialLink(args);
|
|
|
|
|
}
|
|
|
|
|
FlutterError.onError = (details) {
|
|
|
|
|
Future.microtask(() {
|
|
|
|
|
commonPrint.log(
|
|
|
|
|
'exception: ${details.exception} stack: ${details.stack}',
|
|
|
|
|
logLevel: LogLevel.warning,
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
try {
|
|
|
|
|
await RustLib.init();
|
|
|
|
|
final version = await system.init();
|
|
|
|
|
final container = await bootstrap.init(version);
|
2026-10-15 12:31:27 +08:00
|
|
|
await FlClashHttpOverrides.trustCoreRoots();
|
2026-09-05 20:09:39 +08:00
|
|
|
HttpOverrides.global = FlClashHttpOverrides(container);
|
|
|
|
|
request.attach(container.read);
|
|
|
|
|
runApp(
|
|
|
|
|
UncontrolledProviderScope(
|
|
|
|
|
container: container,
|
|
|
|
|
child: const Application(),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
} catch (e, s) {
|
|
|
|
|
runApp(
|
2026-10-08 17:58:43 +08:00
|
|
|
InitErrorApp(
|
|
|
|
|
error: e,
|
|
|
|
|
stack: s,
|
|
|
|
|
onClearData: clearAppData,
|
|
|
|
|
onExit: _exitAfterInitFailure,
|
2026-09-05 20:09:39 +08:00
|
|
|
),
|
|
|
|
|
);
|
2026-10-08 17:58:43 +08:00
|
|
|
unawaited(window?.showInitFailure(onExit: _exitAfterInitFailure));
|
2026-09-05 20:09:39 +08:00
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
(error, stack) {
|
|
|
|
|
FlutterError.reportError(
|
|
|
|
|
FlutterErrorDetails(exception: error, stack: stack),
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
);
|
2024-04-30 23:38:49 +08:00
|
|
|
}
|
2026-10-08 17:58:43 +08:00
|
|
|
|
|
|
|
|
Future<void> _exitAfterInitFailure() async {
|
|
|
|
|
await system.exit();
|
|
|
|
|
window?.forceExit();
|
|
|
|
|
}
|