Add M3U sources persistence UI and provider; integrate saved sources into HomeScreen

This commit is contained in:
2026-01-11 19:57:20 +09:00
parent 9cf16ce279
commit ad7081b342
4 changed files with 106 additions and 34 deletions

View File

@@ -389,39 +389,45 @@ class _PlayerScreenState extends State<PlayerScreen> {
])))), ])))),
if (_playError) if (_playError)
Positioned.fill( Positioned.fill(
child: Container( child: Container(
color: Colors.black54, color: Colors.black54,
child: Center( child: Center(
child: Card( child: Card(
color: Colors.red.shade900, color: Colors.red.shade900,
child: Padding( child: Padding(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text(_errorMessage ?? 'Playback failed', Text(_errorMessage ?? 'Playback failed',
style: const TextStyle( style: const TextStyle(
color: Colors.white, color: Colors.white, fontSize: 16)),
fontSize: 16)), const SizedBox(height: 12),
const SizedBox(height: 12), Row(
Row( mainAxisSize: MainAxisSize.min,
mainAxisSize: MainAxisSize.min, children: [
children: [ TextButton(
TextButton( onPressed: _retryPlay,
onPressed: _retryPlay, child: const Text('Retry',
child: const Text('Retry', style:
style: TextStyle( TextStyle(color: Colors.white)),
color: ),
Colors.white))), const SizedBox(width: 8),
const SizedBox(width: 8), TextButton(
TextButton( onPressed: _inspectStream,
onPressed: _inspectStream, child: const Text('Inspect',
child: const Text('Inspect', style:
style: TextStyle( TextStyle(color: Colors.white)),
color: ),
Colors.white))) ],
]) ),
]))))), ],
),
),
),
),
),
),
AnimatedOpacity( AnimatedOpacity(
opacity: _showControls ? 1.0 : 0.0, opacity: _showControls ? 1.0 : 0.0,
duration: const Duration(milliseconds: 300), duration: const Duration(milliseconds: 300),

View File

@@ -11,6 +11,7 @@ import media_kit_libs_macos_video
import media_kit_video import media_kit_video
import package_info_plus import package_info_plus
import path_provider_foundation import path_provider_foundation
import shared_preferences_foundation
import volume_controller import volume_controller
import wakelock_plus import wakelock_plus
@@ -21,6 +22,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitVideoPlugin")) MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitVideoPlugin"))
FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin"))
PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
VolumeControllerPlugin.register(with: registry.registrar(forPlugin: "VolumeControllerPlugin")) VolumeControllerPlugin.register(with: registry.registrar(forPlugin: "VolumeControllerPlugin"))
WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin"))
} }

View File

@@ -121,6 +121,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.5" version: "2.1.5"
file:
dependency: transitive
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
url: "https://pub.dev"
source: hosted
version: "7.0.1"
file_picker: file_picker:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -464,6 +472,62 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "2939ae520c9024cb197fc20dee269cd8cdbf564c8b5746374ec6cacdc5169e64"
url: "https://pub.dev"
source: hosted
version: "2.5.4"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc"
url: "https://pub.dev"
source: hosted
version: "2.4.18"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "4e7eaffc2b17ba398759f1151415869a34771ba11ebbccd1b0145472a619a64f"
url: "https://pub.dev"
source: hosted
version: "2.5.6"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019
url: "https://pub.dev"
source: hosted
version: "2.4.3"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter

View File

@@ -20,7 +20,7 @@ dependencies:
charset_converter: ^2.1.0 charset_converter: ^2.1.0
http: ^1.6.0 http: ^1.6.0
flutter_riverpod: ^2.3.0 flutter_riverpod: ^2.3.0
shared_preferences: ^3.0.0 shared_preferences: ^2.5.4
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: