diff --git a/lib/screens/rain_radar.dart b/lib/screens/rain_radar.dart index 25a03ed..8f621e7 100644 --- a/lib/screens/rain_radar.dart +++ b/lib/screens/rain_radar.dart @@ -1,5 +1,7 @@ +import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:flutter_gifimage/flutter_gifimage.dart'; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; class RainRadar extends StatefulWidget { const RainRadar({Key? key}) : super(key: key); @@ -12,58 +14,90 @@ class _RainRadarState extends State with SingleTickerProviderStateMixin { late GifController controller; double controllerValue = 0; + bool _gifLoaded = false; + late Uint8List _gifBytes; @override void initState() { super.initState(); + loadGif(); controller = GifController(vsync: this); controller.addListener(() { setState(() { controllerValue = controller.value; }); }); - WidgetsBinding.instance.addPostFrameCallback((_) { - controller.animateTo(24, duration: const Duration(seconds: 10)); + controller.stop(); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + void loadGif() async { + imageCache.clear(); + await DefaultCacheManager() + .getSingleFile('https://www.dwd.de/DWD/wetter/radar/radarvhs.gif') + .then((gif) { + setState(() { + _gifBytes = gif.readAsBytesSync(); + _gifLoaded = true; + }); + controller.animateTo(24, duration: const Duration(seconds: 15)); }); } + Widget _showGif() { + return Column(children: [ + Padding( + padding: const EdgeInsets.all(10), + child: _gifLoaded + ? GifImage(controller: controller, image: MemoryImage(_gifBytes)) + : const CircularProgressIndicator()), + Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + ElevatedButton( + onPressed: () { + int duration = ((15 / 24) * (24 - controller.value)).round(); + controller.animateTo(24, duration: Duration(seconds: duration)); + }, + child: const Icon(Icons.play_arrow)), + const SizedBox(width: 10), + ElevatedButton( + onPressed: () { + controller.stop(); + }, + child: const Icon(Icons.pause)), + ]), + Slider( + onChanged: (v) { + controller.value = v; + setState(() {}); + }, + max: 24, + min: 0, + value: controllerValue, + ) + ]); + } + @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Rain Radar'), ), - body: Column(children: [ - Padding( - padding: const EdgeInsets.all(10), - child: GifImage( - controller: controller, - image: const NetworkImage( - 'https://www.dwd.de/DWD/wetter/radar/radarvhs.gif'))), - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - ElevatedButton( - onPressed: () { - int duration = ((10 / 24) * (24 - controller.value)).round(); - controller.animateTo(24, - duration: Duration(seconds: duration)); - }, - child: const Icon(Icons.play_arrow)), - const SizedBox(width: 10), - ElevatedButton( - onPressed: () { - controller.stop(); - }, - child: const Icon(Icons.pause)), - ]), - Slider( - onChanged: (v) { - controller.value = v; - setState(() {}); - }, - max: 24, - min: 0, - value: controllerValue, - ) - ])); + body: _gifLoaded + ? _showGif() + : Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: const [ + SizedBox( + height: 50, + ), + Center(child: CircularProgressIndicator()) + ])); } } diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 287b6a9..e9cf192 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,8 +5,12 @@ import FlutterMacOS import Foundation +import path_provider_macos import shared_preferences_macos +import sqflite func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/pubspec.lock b/pubspec.lock index d4b061f..0a0ed03 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -43,6 +43,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.16.0" + crypto: + dependency: transitive + description: + name: crypto + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.2" cupertino_icons: dependency: "direct main" description: @@ -76,6 +83,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_cache_manager: + dependency: "direct main" + description: + name: flutter_cache_manager + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" flutter_gifimage: dependency: "direct main" description: @@ -163,6 +177,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.1" + path_provider: + dependency: transitive + description: + name: path_provider + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.20" + path_provider_ios: + dependency: transitive + description: + name: path_provider_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" path_provider_linux: dependency: transitive description: @@ -170,6 +205,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.7" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: @@ -183,7 +225,14 @@ packages: name: path_provider_windows url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" + version: "2.1.3" + pedantic: + dependency: transitive + description: + name: pedantic + url: "https://pub.dartlang.org" + source: hosted + version: "1.11.1" platform: dependency: transitive description: @@ -197,7 +246,7 @@ packages: name: plugin_platform_interface url: "https://pub.dartlang.org" source: hosted - version: "2.1.2" + version: "2.1.3" process: dependency: transitive description: @@ -205,6 +254,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.2.4" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.27.5" shared_preferences: dependency: "direct main" description: @@ -218,7 +274,7 @@ packages: name: shared_preferences_android url: "https://pub.dartlang.org" source: hosted - version: "2.0.12" + version: "2.0.13" shared_preferences_ios: dependency: transitive description: @@ -273,6 +329,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.2" + sqflite: + dependency: transitive + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3+1" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1+1" stack_trace: dependency: transitive description: @@ -294,6 +364,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0+3" term_glyph: dependency: transitive description: @@ -315,6 +392,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.1" + uuid: + dependency: transitive + description: + name: uuid + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.6" vector_math: dependency: transitive description: @@ -335,7 +419,7 @@ packages: name: win32 url: "https://pub.dartlang.org" source: hosted - version: "2.7.0" + version: "3.0.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index fd3189e..7733932 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -39,6 +39,7 @@ dependencies: shared_preferences: ^2.0.15 flutter_gifimage: path: ../flutter_gifimage-1.0.1 + flutter_cache_manager: ^3.3.0 dev_dependencies: flutter_test: