Files
MWClash/lib/application.dart

199 lines
5.9 KiB
Dart
Raw Normal View History

2024-05-06 10:32:39 +08:00
import 'dart:async';
2024-04-30 23:38:49 +08:00
import 'package:dynamic_color/dynamic_color.dart';
import 'package:fl_clash/l10n/l10n.dart';
import 'package:fl_clash/common/common.dart';
import 'package:fl_clash/state.dart';
import 'package:fl_clash/widgets/widgets.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:provider/provider.dart';
import 'controller.dart';
import 'models/models.dart';
import 'pages/pages.dart';
runAppWithPreferences(
Widget child, {
required AppState appState,
required Config config,
required ClashConfig clashConfig,
}) {
runApp(MultiProvider(
providers: [
ChangeNotifierProvider<ClashConfig>(
create: (_) => clashConfig,
),
ChangeNotifierProvider<Config>(
create: (_) => config,
),
2024-05-07 13:50:00 +08:00
ChangeNotifierProxyProvider2<Config, ClashConfig, AppState>(
2024-04-30 23:38:49 +08:00
create: (_) => appState,
2024-05-07 13:50:00 +08:00
update: (_, config, clashConfig, appState) {
appState?.mode = clashConfig.mode;
appState?.isCompatible = config.isCompatible;
appState?.selectedMap = config.currentSelectedMap;
2024-05-07 13:50:00 +08:00
return appState!;
},
2024-04-30 23:38:49 +08:00
)
],
child: child,
));
}
class Application extends StatefulWidget {
const Application({
super.key,
});
@override
State<Application> createState() => ApplicationState();
}
class ApplicationState extends State<Application> {
late SystemColorSchemes systemColorSchemes;
final _pageTransitionsTheme = const PageTransitionsTheme(
builders: <TargetPlatform, PageTransitionsBuilder>{
TargetPlatform.android: CupertinoPageTransitionsBuilder(),
TargetPlatform.windows: CupertinoPageTransitionsBuilder(),
TargetPlatform.linux: CupertinoPageTransitionsBuilder(),
TargetPlatform.macOS: CupertinoPageTransitionsBuilder(),
},
);
2024-04-30 23:38:49 +08:00
ColorScheme _getAppColorScheme({
required Brightness brightness,
int? primaryColor,
required SystemColorSchemes systemColorSchemes,
}) {
if (primaryColor != null) {
return ColorScheme.fromSeed(
seedColor: Color(primaryColor),
brightness: brightness,
);
} else {
return systemColorSchemes.getSystemColorSchemeForBrightness(brightness);
}
}
@override
void initState() {
super.initState();
globalState.appController = AppController(context);
2024-04-30 23:38:49 +08:00
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
globalState.appController.afterInit();
globalState.appController.initLink();
_updateGroups();
2024-04-30 23:38:49 +08:00
});
}
_buildApp(Widget app) {
if (system.isDesktop) {
return WindowContainer(
child: TrayContainer(
child: app,
),
);
}
return AndroidContainer(
child: TileContainer(
child: app,
),
);
}
_updateSystemColorSchemes(
ColorScheme? lightDynamic,
ColorScheme? darkDynamic,
) {
systemColorSchemes = SystemColorSchemes(
lightColorScheme: lightDynamic,
darkColorScheme: darkDynamic,
);
WidgetsBinding.instance.addPostFrameCallback((_) {
globalState.appController.updateSystemColorSchemes(systemColorSchemes);
2024-04-30 23:38:49 +08:00
});
}
_updateGroups() {
if (globalState.groupsUpdateTimer != null) {
globalState.groupsUpdateTimer?.cancel();
globalState.groupsUpdateTimer = null;
}
globalState.groupsUpdateTimer ??= Timer.periodic(
httpTimeoutDuration,
(timer) async {
await globalState.appController.updateGroups();
globalState.appController.appState.sortNum++;
},
);
}
2024-04-30 23:38:49 +08:00
@override
Widget build(context) {
return AppStateContainer(
child: ClashMessageContainer(
child: _buildApp(
Selector2<AppState, Config, ApplicationSelectorState>(
selector: (_, appState, config) => ApplicationSelectorState(
locale: config.locale,
themeMode: config.themeMode,
primaryColor: config.primaryColor,
),
builder: (_, state, child) {
return DynamicColorBuilder(
builder: (lightDynamic, darkDynamic) {
_updateSystemColorSchemes(lightDynamic, darkDynamic);
return MaterialApp(
navigatorKey: globalState.navigatorKey,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate
],
title: appName,
locale: other.getLocaleForString(state.locale),
2024-04-30 23:38:49 +08:00
supportedLocales:
AppLocalizations.delegate.supportedLocales,
2024-04-30 23:38:49 +08:00
themeMode: state.themeMode,
theme: ThemeData(
pageTransitionsTheme: _pageTransitionsTheme,
2024-04-30 23:38:49 +08:00
useMaterial3: true,
colorScheme: _getAppColorScheme(
brightness: Brightness.light,
systemColorSchemes: systemColorSchemes,
primaryColor: state.primaryColor,
),
),
darkTheme: ThemeData(
useMaterial3: true,
pageTransitionsTheme: _pageTransitionsTheme,
2024-04-30 23:38:49 +08:00
colorScheme: _getAppColorScheme(
brightness: Brightness.dark,
systemColorSchemes: systemColorSchemes,
primaryColor: state.primaryColor,
),
),
home: child,
);
},
);
},
child: const HomePage(),
),
),
),
);
}
@override
Future<void> dispose() async {
linkManager.destroy();
await globalState.appController.savePreferences();
2024-04-30 23:38:49 +08:00
super.dispose();
}
}