This commit is contained in:
Yoshi 2024-07-09 23:03:40 +03:00
parent 9a7858f279
commit dd3339bc3b
8 changed files with 1067 additions and 950 deletions

View file

@ -45,7 +45,9 @@ class _CreateWeatherCardState extends State<CreateWeatherCard> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
const kTextFieldElevation = 4.0; const kTextFieldElevation = 4.0;
return Form( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),
child: Form(
key: formKey, key: formKey,
child: SingleChildScrollView( child: SingleChildScrollView(
child: Stack( child: Stack(
@ -246,6 +248,7 @@ class _CreateWeatherCardState extends State<CreateWeatherCard> {
], ],
), ),
), ),
),
); );
} }
} }

View file

@ -69,7 +69,9 @@ class _SettingsPageState extends State<SettingsPage> {
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return StatefulBuilder( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),
child: StatefulBuilder(
builder: (BuildContext context, setState) { builder: (BuildContext context, setState) {
return SingleChildScrollView( return SingleChildScrollView(
child: Column( child: Column(
@ -145,6 +147,7 @@ class _SettingsPageState extends State<SettingsPage> {
), ),
); );
}, },
),
); );
}, },
); );
@ -157,7 +160,9 @@ class _SettingsPageState extends State<SettingsPage> {
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return StatefulBuilder( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),
child: StatefulBuilder(
builder: (BuildContext context, setState) { builder: (BuildContext context, setState) {
return SingleChildScrollView( return SingleChildScrollView(
child: Column( child: Column(
@ -419,6 +424,7 @@ class _SettingsPageState extends State<SettingsPage> {
), ),
); );
}, },
),
); );
}, },
); );
@ -431,7 +437,9 @@ class _SettingsPageState extends State<SettingsPage> {
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return StatefulBuilder( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),
child: StatefulBuilder(
builder: (BuildContext context, setState) { builder: (BuildContext context, setState) {
return SingleChildScrollView( return SingleChildScrollView(
child: Column( child: Column(
@ -533,6 +541,7 @@ class _SettingsPageState extends State<SettingsPage> {
), ),
); );
}, },
),
); );
}, },
); );
@ -545,7 +554,9 @@ class _SettingsPageState extends State<SettingsPage> {
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return StatefulBuilder( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),
child: StatefulBuilder(
builder: (BuildContext context, setState) { builder: (BuildContext context, setState) {
return SingleChildScrollView( return SingleChildScrollView(
child: Column( child: Column(
@ -737,6 +748,7 @@ class _SettingsPageState extends State<SettingsPage> {
), ),
); );
}, },
),
); );
}, },
); );
@ -756,7 +768,9 @@ class _SettingsPageState extends State<SettingsPage> {
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return StatefulBuilder( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),
child: StatefulBuilder(
builder: (BuildContext context, setState) { builder: (BuildContext context, setState) {
return ListView( return ListView(
children: [ children: [
@ -800,6 +814,7 @@ class _SettingsPageState extends State<SettingsPage> {
], ],
); );
}, },
),
); );
}, },
); );
@ -812,7 +827,9 @@ class _SettingsPageState extends State<SettingsPage> {
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return StatefulBuilder( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),
child: StatefulBuilder(
builder: (BuildContext context, setState) { builder: (BuildContext context, setState) {
return SingleChildScrollView( return SingleChildScrollView(
child: Column( child: Column(
@ -847,6 +864,7 @@ class _SettingsPageState extends State<SettingsPage> {
), ),
); );
}, },
),
); );
}, },
); );
@ -859,7 +877,9 @@ class _SettingsPageState extends State<SettingsPage> {
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
return StatefulBuilder( return Padding(
padding: EdgeInsets.only(bottom: MediaQuery.of(context).padding.bottom),
child: StatefulBuilder(
builder: (BuildContext context, setState) { builder: (BuildContext context, setState) {
return SingleChildScrollView( return SingleChildScrollView(
child: Column( child: Column(
@ -907,6 +927,7 @@ class _SettingsPageState extends State<SettingsPage> {
), ),
); );
}, },
),
); );
}, },
); );

View file

@ -18,6 +18,7 @@ import 'package:rain/app/modules/geolocation.dart';
import 'package:rain/app/modules/home.dart'; import 'package:rain/app/modules/home.dart';
import 'package:rain/app/modules/onboarding.dart'; import 'package:rain/app/modules/onboarding.dart';
import 'package:rain/theme/theme.dart'; import 'package:rain/theme/theme.dart';
import 'package:rain/utils/device_info.dart';
import 'package:time_machine/time_machine.dart'; import 'package:time_machine/time_machine.dart';
import 'package:timezone/data/latest_all.dart' as tz; import 'package:timezone/data/latest_all.dart' as tz;
import 'package:timezone/timezone.dart' as tz; import 'package:timezone/timezone.dart' as tz;
@ -92,8 +93,7 @@ void main() async {
? isOnline.value = Future(() => false) ? isOnline.value = Future(() => false)
: isOnline.value = InternetConnection().hasInternetAccess; : isOnline.value = InternetConnection().hasInternetAccess;
}); });
SystemChrome.setSystemUIOverlayStyle( DeviceFeature().init();
const SystemUiOverlayStyle(systemNavigationBarColor: Colors.black));
if (Platform.isAndroid) { if (Platform.isAndroid) {
Workmanager().initialize(callbackDispatcher, isInDebugMode: kDebugMode); Workmanager().initialize(callbackDispatcher, isInDebugMode: kDebugMode);
await setOptimalDisplayMode(); await setOptimalDisplayMode();
@ -284,34 +284,42 @@ class _MyAppState extends State<MyApp> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final edgeToEdgeAvailable = DeviceFeature().isEdgeToEdgeAvailable();
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
return GestureDetector( return GestureDetector(
onTap: () => FocusManager.instance.primaryFocus?.unfocus(), onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
child: DynamicColorBuilder( child: DynamicColorBuilder(
builder: (lightColorScheme, darkColorScheme) { builder: (lightColorScheme, darkColorScheme) {
final lightMaterialTheme = final lightMaterialTheme = lightTheme(
lightTheme(lightColorScheme?.surface, lightColorScheme); lightColorScheme?.surface, lightColorScheme, edgeToEdgeAvailable);
final darkMaterialTheme = final darkMaterialTheme = darkTheme(
darkTheme(darkColorScheme?.surface, darkColorScheme); darkColorScheme?.surface, darkColorScheme, edgeToEdgeAvailable);
final darkMaterialThemeOled = darkTheme(oledColor, darkColorScheme); final darkMaterialThemeOled =
darkTheme(oledColor, darkColorScheme, edgeToEdgeAvailable);
return GetMaterialApp( return GetMaterialApp(
themeMode: themeController.theme, themeMode: themeController.theme,
theme: materialColor theme: materialColor
? lightColorScheme != null ? lightColorScheme != null
? lightMaterialTheme ? lightMaterialTheme
: lightTheme(lightColor, colorSchemeLight) : lightTheme(
: lightTheme(lightColor, colorSchemeLight), lightColor, colorSchemeLight, edgeToEdgeAvailable)
: lightTheme(lightColor, colorSchemeLight, edgeToEdgeAvailable),
darkTheme: amoledTheme darkTheme: amoledTheme
? materialColor ? materialColor
? darkColorScheme != null ? darkColorScheme != null
? darkMaterialThemeOled ? darkMaterialThemeOled
: darkTheme(oledColor, colorSchemeDark) : darkTheme(
: darkTheme(oledColor, colorSchemeDark) oledColor, colorSchemeDark, edgeToEdgeAvailable)
: darkTheme(oledColor, colorSchemeDark, edgeToEdgeAvailable)
: materialColor : materialColor
? darkColorScheme != null ? darkColorScheme != null
? darkMaterialTheme ? darkMaterialTheme
: darkTheme(darkColor, colorSchemeDark) : darkTheme(
: darkTheme(darkColor, colorSchemeDark), darkColor, colorSchemeDark, edgeToEdgeAvailable)
: darkTheme(
darkColor, colorSchemeDark, edgeToEdgeAvailable),
localizationsDelegates: const [ localizationsDelegates: const [
GlobalMaterialLocalizations.delegate, GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate, GlobalWidgetsLocalizations.delegate,

View file

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:dynamic_color/dynamic_color.dart'; import 'package:dynamic_color/dynamic_color.dart';
@ -18,7 +19,8 @@ ColorScheme colorSchemeDark = ColorScheme.fromSeed(
brightness: Brightness.dark, brightness: Brightness.dark,
); );
ThemeData lightTheme(Color? color, ColorScheme? colorScheme) { ThemeData lightTheme(
Color? color, ColorScheme? colorScheme, bool edgeToEdgeAvailable) {
return baseLigth.copyWith( return baseLigth.copyWith(
brightness: Brightness.light, brightness: Brightness.light,
colorScheme: colorScheme colorScheme: colorScheme
@ -34,6 +36,16 @@ ThemeData lightTheme(Color? color, ColorScheme? colorScheme) {
shadowColor: Colors.transparent, shadowColor: Colors.transparent,
surfaceTintColor: Colors.transparent, surfaceTintColor: Colors.transparent,
elevation: 0, elevation: 0,
systemOverlayStyle: SystemUiOverlayStyle(
statusBarIconBrightness: Brightness.dark,
statusBarColor: Colors.transparent,
systemStatusBarContrastEnforced: false,
systemNavigationBarContrastEnforced: false,
systemNavigationBarDividerColor: Colors.transparent,
systemNavigationBarIconBrightness: Brightness.dark,
systemNavigationBarColor:
edgeToEdgeAvailable ? Colors.transparent : colorScheme?.surface,
),
), ),
primaryColor: color, primaryColor: color,
canvasColor: color, canvasColor: color,
@ -74,7 +86,8 @@ ThemeData lightTheme(Color? color, ColorScheme? colorScheme) {
); );
} }
ThemeData darkTheme(Color? color, ColorScheme? colorScheme) { ThemeData darkTheme(
Color? color, ColorScheme? colorScheme, bool edgeToEdgeAvailable) {
return baseDark.copyWith( return baseDark.copyWith(
brightness: Brightness.dark, brightness: Brightness.dark,
colorScheme: colorScheme colorScheme: colorScheme
@ -90,6 +103,16 @@ ThemeData darkTheme(Color? color, ColorScheme? colorScheme) {
shadowColor: Colors.transparent, shadowColor: Colors.transparent,
surfaceTintColor: Colors.transparent, surfaceTintColor: Colors.transparent,
elevation: 0, elevation: 0,
systemOverlayStyle: SystemUiOverlayStyle(
statusBarIconBrightness: Brightness.light,
statusBarColor: Colors.transparent,
systemStatusBarContrastEnforced: false,
systemNavigationBarContrastEnforced: false,
systemNavigationBarDividerColor: Colors.transparent,
systemNavigationBarIconBrightness: Brightness.light,
systemNavigationBarColor:
edgeToEdgeAvailable ? Colors.transparent : colorScheme?.surface,
),
), ),
primaryColor: color, primaryColor: color,
canvasColor: color, canvasColor: color,

View file

@ -0,0 +1,31 @@
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/foundation.dart';
class DeviceFeature {
DeviceFeature._internal();
static final DeviceFeature _singleton = DeviceFeature._internal();
factory DeviceFeature() {
return _singleton;
}
final _deviceInfoPlugin = DeviceInfoPlugin();
AndroidDeviceInfo? _androidDeviceInfo;
Future<void> init() async {
try {
_androidDeviceInfo = await _deviceInfoPlugin.androidInfo;
} catch (e) {
if (kDebugMode) {
print('Error initializing device info: $e');
}
}
}
bool isEdgeToEdgeAvailable() {
return _androidDeviceInfo != null &&
_androidDeviceInfo!.version.sdkInt > 28;
}
}

View file

@ -6,6 +6,7 @@ import FlutterMacOS
import Foundation import Foundation
import connectivity_plus import connectivity_plus
import device_info_plus
import dynamic_color import dynamic_color
import flutter_local_notifications import flutter_local_notifications
import flutter_timezone import flutter_timezone
@ -17,6 +18,7 @@ import url_launcher_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin")) ConnectivityPlusPlugin.register(with: registry.registrar(forPlugin: "ConnectivityPlusPlugin"))
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin"))
FlutterTimezonePlugin.register(with: registry.registrar(forPlugin: "FlutterTimezonePlugin")) FlutterTimezonePlugin.register(with: registry.registrar(forPlugin: "FlutterTimezonePlugin"))

View file

@ -233,6 +233,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.10" version: "0.7.10"
device_info_plus:
dependency: "direct main"
description:
name: device_info_plus
sha256: eead12d1a1ed83d8283ab4c2f3fca23ac4082f29f25f29dff0f758f57d06ec91
url: "https://pub.dev"
source: hosted
version: "10.1.0"
device_info_plus_platform_interface:
dependency: transitive
description:
name: device_info_plus_platform_interface
sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64
url: "https://pub.dev"
source: hosted
version: "7.0.0"
dio: dio:
dependency: "direct main" dependency: "direct main"
description: description:
@ -302,6 +318,15 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.0" version: "0.6.0"
flutter_glow:
dependency: "direct main"
description:
path: "."
ref: HEAD
resolved-ref: "7c5e1fd34583db4b40073add9ca329b03bf52a51"
url: "https://github.com/payam-zahedi/flutter-glow.git"
source: git
version: "0.3.1"
flutter_hsvcolor_picker: flutter_hsvcolor_picker:
dependency: "direct main" dependency: "direct main"
description: description:
@ -372,10 +397,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_timezone name: flutter_timezone
sha256: b7448ff8a9e1350606727e40b3f314aa798a6a1cc07127eba58f09b98a66f03f sha256: f9c328f66d58cd2af8a0cbd2f84d0c211fda8b7332b5e458d9848bd9ec936120
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.0" version: "2.0.1"
flutter_web_plugins: flutter_web_plugins:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -393,10 +418,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: freezed_annotation name: freezed_annotation
sha256: f54946fdb1fa7b01f780841937b1a80783a20b393485f3f6cdf336fd6f4705f2 sha256: f9f6597ac43cc262fa7d7f2e65259a6060c23a560525d1f2631be374540f2a9b
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.4.2" version: "2.4.3"
frontend_server_client: frontend_server_client:
dependency: transitive dependency: transitive
description: description:
@ -625,18 +650,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: js name: js
sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.7" version: "0.7.1"
js_interop:
dependency: transitive
description:
name: js_interop
sha256: "7ec859c296958ccea34dc770504bd3ff4ae52fdd9e7eeb2bacc7081ad476a1f5"
url: "https://pub.dev"
source: hosted
version: "0.0.1"
json_annotation: json_annotation:
dependency: "direct main" dependency: "direct main"
description: description:
@ -785,10 +802,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_provider_android name: path_provider_android
sha256: bca87b0165ffd7cdb9cad8edd22d18d2201e886d9a9f19b4fb3452ea7df3a72a sha256: "30c5aa827a6ae95ce2853cdc5fe3971daaac00f6f081c419c013f7f57bff2f5e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.6" version: "2.2.7"
path_provider_foundation: path_provider_foundation:
dependency: transitive dependency: transitive
description: description:
@ -817,10 +834,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: path_provider_windows name: path_provider_windows
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.1" version: "2.3.0"
petitparser: petitparser:
dependency: transitive dependency: transitive
description: description:
@ -1162,6 +1179,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.5.1" version: "5.5.1"
win32_registry:
dependency: transitive
description:
name: win32_registry
sha256: "10589e0d7f4e053f2c61023a31c9ce01146656a70b7b7f0828c0b46d7da2a9bb"
url: "https://pub.dev"
source: hosted
version: "1.1.3"
workmanager: workmanager:
dependency: "direct main" dependency: "direct main"
description: description:

View file

@ -29,14 +29,18 @@ dependencies:
google_fonts: ^6.2.1 google_fonts: ^6.2.1
url_launcher: ^6.3.0 url_launcher: ^6.3.0
time_machine: ^0.9.17 time_machine: ^0.9.17
flutter_glow:
git:
url: https://github.com/payam-zahedi/flutter-glow.git
dynamic_color: ^1.7.0 dynamic_color: ^1.7.0
path_provider: ^2.1.3 path_provider: ^2.1.3
# quick_settings: ^1.0.1 # quick_settings: ^1.0.1
json_annotation: ^4.9.0 json_annotation: ^4.9.0
flutter_timezone: ^2.0.0 flutter_timezone: ^2.0.1
device_info_plus: ^10.1.0
package_info_plus: ^8.0.0 package_info_plus: ^8.0.0
connectivity_plus: ^6.0.3 connectivity_plus: ^6.0.3
freezed_annotation: ^2.4.2 freezed_annotation: ^2.4.3
isar_flutter_libs: isar_flutter_libs:
version: ^3.1.7 version: ^3.1.7
hosted: https://pub.isar-community.dev/ hosted: https://pub.isar-community.dev/