diff --git a/lib/controllers/progressbar_controller.dart b/lib/controllers/progressbar_controller.dart index 5d990b2..6f369a5 100644 --- a/lib/controllers/progressbar_controller.dart +++ b/lib/controllers/progressbar_controller.dart @@ -6,6 +6,7 @@ class ProgressbarController extends GetxController { _updateWidget(bool loading) { if (loading) + // 不要修改,会炸 widget.value = Container( child: LinearProgressIndicator( value: null, diff --git a/lib/main.dart b/lib/main.dart index b2e3534..f6738f2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,10 @@ +import 'package:dynamic_color/dynamic_color.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:miofeed/controllers/progressbar_controller.dart'; import 'package:miofeed/ui/home.dart'; -import 'package:miofeed/ui/paragraph.dart'; import 'package:miofeed/ui/settings.dart'; +import 'package:miofeed/ui/settings/render.dart'; import 'package:miofeed/ui/settings/rss_sub.dart'; import 'package:miofeed/ui/settings/theme.dart'; import 'package:miofeed/utils/rss/rss_cache.dart'; @@ -21,31 +22,68 @@ void main() async { class MyApp extends StatelessWidget { const MyApp({super.key}); + // 默认主题色种子 + static const _defaultColorSeed = Colors.blueAccent; + // This widget is the root of your application. @override Widget build(BuildContext context) { Get.put(ProgressbarController()); - return GetMaterialApp( - title: 'MioFeed', - theme: ThemeData( - useMaterial3: true, - colorSchemeSeed: Colors.blueAccent, - fontFamily: 'Microsoft YaHei', - ), - darkTheme: ThemeData( - useMaterial3: true, - brightness: Brightness.dark, - colorSchemeSeed: Colors.blueAccent, - fontFamily: 'Microsoft YaHei', - ), - themeMode: ThemeMode.system, - routes: { - '/home': (context) => HomeUI(title: title), - '/settings': (context) => SettingsUI(title: title), - '/settings/rss_sub': (context) => const RssSubSettingUI(title: title), - '/settings/theme': (context) => ThemeSettingUI(title: title), + // Monet 取色 + return DynamicColorBuilder( + builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) { + ColorScheme lightColorScheme; + ColorScheme darkColorScheme; + + if (lightDynamic != null && darkDynamic != null) { + // On Android S+ devices, use the provided dynamic color scheme. + // (Recommended) Harmonize the dynamic color scheme' built-in semantic colors. + lightColorScheme = lightDynamic.harmonized(); + // (Optional) Customize the scheme as desired. For example, one might + // want to use a brand color to override the dynamic [ColorScheme.secondary]. + // lightColorScheme = lightColorScheme.copyWith(secondary: _defaultColorSeed); + // (Optional) If applicable, harmonize custom colors. + // lightCustomColors = lightCustomColors.harmonized(lightColorScheme); + + // Repeat for the dark color scheme. + darkColorScheme = darkDynamic.harmonized(); + // darkColorScheme = darkColorScheme.copyWith(secondary: _defaultColorSeed); + // darkCustomColors = darkCustomColors.harmonized(darkColorScheme); + } else { + // Fallback + lightColorScheme = ColorScheme.fromSeed( + seedColor: _defaultColorSeed, + ); + darkColorScheme = ColorScheme.fromSeed( + seedColor: _defaultColorSeed, + brightness: Brightness.dark, + ); + } + return GetMaterialApp( + title: 'MioFeed', + theme: ThemeData( + useMaterial3: true, + colorScheme: lightColorScheme, + fontFamily: 'Microsoft YaHei', + ), + darkTheme: ThemeData( + useMaterial3: true, + brightness: Brightness.dark, + colorScheme: darkColorScheme, + fontFamily: 'Microsoft YaHei', + ), + themeMode: ThemeMode.system, + routes: { + '/home': (context) => HomeUI(title: title), + '/settings': (context) => SettingsUI(title: title), + '/settings/rss_sub': (context) => + const RssSubSettingUI(title: title), + '/settings/theme': (context) => ThemeSettingUI(title: title), + '/settings/render': (context) => RenderSettingUI(title: title), + }, + home: HomeUI(title: title), + ); }, - home: HomeUI(title: title), ); } } diff --git a/lib/models/universal_item.dart b/lib/models/universal_item.dart index 2327632..c401cf1 100644 --- a/lib/models/universal_item.dart +++ b/lib/models/universal_item.dart @@ -1,5 +1,3 @@ -import 'package:miofeed/models/universal_feed.dart'; - import 'generator.dart'; class UniversalItem { diff --git a/lib/ui/settings.dart b/lib/ui/settings.dart index b6b375a..2c768f6 100644 --- a/lib/ui/settings.dart +++ b/lib/ui/settings.dart @@ -48,6 +48,15 @@ class SettingsUI extends StatelessWidget { Get.toNamed('/settings/theme'); }, ), + InkWell( + child: const ListTile( + leading: Icon(Icons.view_in_ar), + title: Text("渲染设置"), + ), + onTap: () async { + Get.toNamed('/settings/render'); + }, + ), ], ), bottomNavigationBar: NavigationBarX().build(), diff --git a/lib/ui/settings/render.dart b/lib/ui/settings/render.dart new file mode 100644 index 0000000..d7a6d18 --- /dev/null +++ b/lib/ui/settings/render.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +import '../../controllers/progressbar_controller.dart'; +import '../models/navigation_bar.dart'; + +class RenderSettingUI extends StatelessWidget { + RenderSettingUI({super.key, required this.title}); + + final String title; + + final ProgressbarController progressbar = Get.find(); + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(title), + bottom: PreferredSize( + preferredSize: Size(MediaQuery.of(context).size.width, 3), + child: SizedBox( + width: MediaQuery.of(context).size.width, + height: 3, + child: Obx(() => progressbar.widget.value), + ), + ), + ), + body: const Center( + child: Text('Coming soon'), + ), + bottomNavigationBar: NavigationBarX().build(), + ); + } +} diff --git a/lib/ui/settings/rss_sub/new.dart b/lib/ui/settings/rss_sub/new.dart index 23737e2..95cd60d 100644 --- a/lib/ui/settings/rss_sub/new.dart +++ b/lib/ui/settings/rss_sub/new.dart @@ -216,11 +216,16 @@ class _RssSubNewState extends State { try { res = await NetworkGetRss().get(rssSubLinkTextController.text); } catch (e, s) { - ScaffoldMessenger.of(context).showSnackBar( - const SnackBar( - content: Text("无法请求订阅,请检查订阅链接是否正确或重试!"), - ), - ); + if (context.mounted) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + content: Text( + "无法请求订阅,请检查订阅链接是否正确或重试!"), + ), + ); + } + print(e); + print(s); progressbar.finish(); return; } diff --git a/lib/ui/settings/theme.dart b/lib/ui/settings/theme.dart index 11dae0e..e9afdd1 100644 --- a/lib/ui/settings/theme.dart +++ b/lib/ui/settings/theme.dart @@ -25,8 +25,8 @@ class ThemeSettingUI extends StatelessWidget { ), ), ), - body: Center( - child: Text('test'), + body: const Center( + child: Text('Coming soon'), ), bottomNavigationBar: NavigationBarX().build(), ); diff --git a/lib/utils/paragraph_utils.dart b/lib/utils/paragraph_utils.dart index 51276ea..996a6eb 100644 --- a/lib/utils/paragraph_utils.dart +++ b/lib/utils/paragraph_utils.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:miofeed/utils/color.dart' as color_utils; class ParagraphUtils { + /// 通过订阅名生成文字图标 static Widget buildColorIcon(String subName) { return Container( color: color_utils.Color.stringToColor(subName), diff --git a/lib/utils/rss/rss_cache.dart b/lib/utils/rss/rss_cache.dart index 1a39dbc..5f89fb0 100644 --- a/lib/utils/rss/rss_cache.dart +++ b/lib/utils/rss/rss_cache.dart @@ -1,4 +1,3 @@ -import 'dart:convert'; import 'dart:io'; import 'package:dart_rss/dart_rss.dart'; diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index f6f23bf..fe56f8d 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,9 +6,13 @@ #include "generated_plugin_registrant.h" +#include #include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) dynamic_color_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "DynamicColorPlugin"); + dynamic_color_plugin_register_with_registrar(dynamic_color_registrar); g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index f16b4c3..1836621 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + dynamic_color url_launcher_linux ) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index b0fb1c6..848d8ac 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -6,6 +6,7 @@ import FlutterMacOS import Foundation import audio_session +import dynamic_color import just_audio import package_info_plus import path_provider_foundation @@ -19,6 +20,7 @@ import webview_flutter_wkwebview func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) + DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) diff --git a/pubspec.lock b/pubspec.lock index 2c23d72..a90dcf5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -177,6 +177,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + dynamic_color: + dependency: "direct main" + description: + name: dynamic_color + sha256: eae98052fa6e2826bdac3dd2e921c6ce2903be15c6b7f8b6d8a5d49b5086298d + url: "https://pub.dev" + source: hosted + version: "1.7.0" fake_async: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 92b1194..aefaf6a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -45,6 +45,7 @@ dependencies: url_launcher: ^6.3.0 share_plus: ^10.0.2 intl: ^0.19.0 + dynamic_color: ^1.7.0 dev_dependencies: flutter_test: diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index c3384ec..1a40a84 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,10 +6,13 @@ #include "generated_plugin_registrant.h" +#include #include #include void RegisterPlugins(flutter::PluginRegistry* registry) { + DynamicColorPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("DynamicColorPluginCApi")); SharePlusWindowsPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("SharePlusWindowsPluginCApi")); UrlLauncherWindowsRegisterWithRegistrar( diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 01d3836..9feb042 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + dynamic_color share_plus url_launcher_windows )