From 27a045741e2efcc6bce188c25d9c77c9f603f4d7 Mon Sep 17 00:00:00 2001 From: baldeau Date: Fri, 22 Mar 2024 01:37:13 +0100 Subject: [PATCH] last code cleanup --- assets/rive/dark_light_switch.riv | Bin 11588 -> 0 bytes assets/rive/walk_cycle_blend.riv | Bin 43816 -> 0 bytes assets/rive/weather_icon_animation.riv | Bin 3038 -> 0 bytes assets/video/SOURCE.md | 2 + .../business/service/matrix_service.dart | 23 +- .../presentation/widgets/pixel_painter.dart | 1 - .../business/service/morse_service.dart | 4 - .../data/models/teaser_image_url.dart | 62 - .../data/models/teaser_image_url.freezed.dart | 154 -- .../data/models/teaser_image_url.g.dart | 18 - lib/main.dart | 4 + pubspec.lock | 8 + pubspec.yaml | 3 +- uml.txt | 1374 +++++++++++++++++ 14 files changed, 1411 insertions(+), 242 deletions(-) delete mode 100644 assets/rive/dark_light_switch.riv delete mode 100644 assets/rive/walk_cycle_blend.riv delete mode 100644 assets/rive/weather_icon_animation.riv create mode 100644 assets/video/SOURCE.md delete mode 100644 lib/features/news_api/data/models/teaser_image_url.dart delete mode 100644 lib/features/news_api/data/models/teaser_image_url.freezed.dart delete mode 100644 lib/features/news_api/data/models/teaser_image_url.g.dart create mode 100644 uml.txt diff --git a/assets/rive/dark_light_switch.riv b/assets/rive/dark_light_switch.riv deleted file mode 100644 index 326ff9a99abc49ae7700b9a6bd41335328f9991a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11588 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 diff --git a/assets/rive/walk_cycle_blend.riv b/assets/rive/walk_cycle_blend.riv deleted file mode 100644 index 733caeb1687c0d3982d52ad78bdc00f46bd68706..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43816 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 diff --git a/assets/rive/weather_icon_animation.riv b/assets/rive/weather_icon_animation.riv deleted file mode 100644 index 4d4fbead604b89356bbae9b194138fd4839b03d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3038 zcmaJ?Yj9K57TzcAX|ZiyP|G=pkTx`hcr{H!Eq$JolSHQ|wk9RLI6w_FrP0zrn!a?D zATnStULW|NR;A7`%HxW4F345%Ce4u|J`uH|fM5l*9mJ}m;)ulkYLmi@KX$v<`qsD3 zT5GSbbym6^so>zjIbbSaQi0fHp9CU>_NxG}*wO&d+mbVG^S0}(f#5Q~Cr}R*$r-g? zPq5J&sPirNH?u$!+GrQF=!fz<{jg1Seu%NdDAv~GZ>?t;<)qJ-NUH0;+*k^oY1moU z;92fv6&m%&?Sj@+*d!?L=!r_I2YW;rB(X{AFV&S1WnYO?Qia~LNkGFUYm(NN3Ccsy zuM<^o)TCPh%d$YvvRq}?YgT?}{!jhRp%XLrxYk~HA7flqM3VU2kETb!WOh~V!|r7< zlvvrPD~CCak62;OG!>A(kHAdnFjG3$D|~3>?ca4pU77{cB;@8+y%v&qaN7}-WOY2r zXz;7(SP~5k)bgQ$|BEn*maE=TCGnx7eNk6r$7+;B%Wd3oN`m|V<)aC-`s?eK`RhAb zg;MEQVN-Q)UmAr4W$74@!cOG|{~U_&`xSMOn)NrOiwkGF7fJ3ZC7t2gkolklKQop4 zq<@Lb?|$qB**UWMR?#)uW3pjp=-VAKA9;CKv?gQV_wd51`wJv@%c2gk)|_>WFzx%# z%KQ^wz1r{0JN}g5Qtf<*_$R;QlX>@NR>^tpxj>mKy5)=nwCvr+xo_vm*{8%ve@;fG zQP!W&{ErN#u-6(!hu@CnZFZOiWaR-658IKuIxX#e% zGsW=b$o|cMgeN7ZlU-=?t!NBhHVQo+#jJz@xO3aXwJ#hvfy$l59bU6s<`)fYlby%Z zm7?py-ZC_RS=^S3eKNoC*CWvy`7Sts|Ndr}IDlDPk@=j=1DCVkx%jOOf@|d7Zjy0y zq*3NiOUai#dIoPB=SE9Y!$FO~Jz>{=?pMvR6}FU3$tM#IUIFUH0O&|*~P zpOCW)3fttI`!lx6dh`}B>UzWWKXCZ<25>S)2cSq!a^gtamh z$t36}63JKpyuu-Bj;d1x?JYNgu=1U6{881y*N^wZbv9qAlLDd>Y0|G@)$K$l7C0~q zw_wfFR(|b_KPT$MGC?Q7T&^U7bYh;MlX+u0Ddu*5{)Ncz$~-2(oW)lvrkD%f*Cp{6 zuYNNOH@-EVE>STRP!$4qdPHI6+p61J` z4FeZXTc&Ohlw$YrKGo51R|yo7U7L1vy#QB8&pP;d3Z?A280nGVf;hMmh0?}rhEw*{ z98(_(FT4c(Zg>-F(QPc=Mz(64gi@e*VLU!e;&~Tt< z89L)$Xn4`#);?Ym<_CYfQHJey}noK4DGTAJ8^zgSG z9soEt*#v@0Yd!<7X{OMLW^&b-P8B{%u6k3b?FOqE1r)?%=fz_y;<0v9=+a>kMpl`6 zU;P^Kr-PYAQ*8c~tD3wWI#082r6=g~H|q+DN10NltgL(wQ^5e+{m zZ&FL_7;nj^b&~IbP3`jdchCK}0U7kW6rya5k&0*IBKLiOzgv%u zE#2+tyS=1F3LPgF#z@74S^nldD3~xCwm*=-q!49djJH%xm{iZ5YY>4<3aKDoF@`#>3jy zSC3Zo7Hj|!{zsf)+dyX3`wE6+VquKTJRb*dZom)TgbiBpb`ndW)5J=sm@q#*8$?AC zX2Vr@?J1K&l!>wUzLJXnRgRTSDy|G{LaAuQ6rvSlj7*9!r~hvi3MR~f!&uprNg>L_ vSYeUc74!tXx&@x)jlO2D&J2pXnABT6o!$VvR{-nNOcD@*KrZD^G64JqBBFlU diff --git a/assets/video/SOURCE.md b/assets/video/SOURCE.md new file mode 100644 index 0000000..5e0b9ed --- /dev/null +++ b/assets/video/SOURCE.md @@ -0,0 +1,2 @@ +Video source: https://www.pexels.com/video/a-herd-of-deer-resting-on-a-ground-with-snowfall-3195315/ +License: CC diff --git a/lib/features/matrix_rgb/business/service/matrix_service.dart b/lib/features/matrix_rgb/business/service/matrix_service.dart index 92f881c..cbc4fc4 100644 --- a/lib/features/matrix_rgb/business/service/matrix_service.dart +++ b/lib/features/matrix_rgb/business/service/matrix_service.dart @@ -2,7 +2,7 @@ import 'package:dart_periphery/dart_periphery.dart'; import 'package:flutter/foundation.dart'; // linux_spidev was tried out here beforehand, -// but it didn't work and was replaced by dart_periphery +// but it didn't work well and was replaced by dart_periphery // import 'package:linux_spidev/linux_spidev.dart'; class MatrixService { @@ -10,7 +10,28 @@ class MatrixService { // final spidev = Spidev.fromBusDevNrs(0, 0); void setLedsOn(List pixels) async { + // linux_spidev will error out with this console log: + // flutter: OS Error: Could not open spidev file at "/dev/spidev0.0" + // Failed to import fence to syncobj: -1 + + // Using linux_spidev: + // try { // final handle = spidev.open(); + // final typedData = Uint8List.fromList(pixels); + // await handle.transferSingleTypedData(txBuf: typedData, rxBuf: typedData); + // handle.close(); + // } catch (e) { + // debugPrint(e.toString()); + // } + + // If a tuple error happens with StackTrace? has to be StackTrace: + // In the source code of spidev.dart line 395, change it to: + // before: + // sendPort.send(Tuple3(transferId, null, null)); + // after: + // sendPort.send(Tuple3(transferId, null, StackTrace.current)); + + // Using dart_periphery: try { int refresh = 1; while (refresh != 0) { diff --git a/lib/features/matrix_rgb/presentation/widgets/pixel_painter.dart b/lib/features/matrix_rgb/presentation/widgets/pixel_painter.dart index d773c44..9ecffd0 100644 --- a/lib/features/matrix_rgb/presentation/widgets/pixel_painter.dart +++ b/lib/features/matrix_rgb/presentation/widgets/pixel_painter.dart @@ -35,7 +35,6 @@ class PixelPainter extends CustomPainter { ); } - // Assuming 'width' represents the width of your matrix (in this case, 8) const width = 8; List colorIntList = pixels.map((pixel) { diff --git a/lib/features/morse_led/business/service/morse_service.dart b/lib/features/morse_led/business/service/morse_service.dart index f803394..d8af83a 100644 --- a/lib/features/morse_led/business/service/morse_service.dart +++ b/lib/features/morse_led/business/service/morse_service.dart @@ -13,24 +13,20 @@ class MorseService { for (var char in chars) { final List morseCode = _morseAlphabet[char]?.split('') ?? ['*']; for (var code in morseCode) { - print('CODE: $code from $morseCode'); if (code == '*') { await Future.delayed(const Duration(milliseconds: pulseDuration * 7)); break; } ledPin.setValue(true); - print('ON'); if (code == '.') { await Future.delayed(const Duration(milliseconds: pulseDuration)); } else if (code == '-') { await Future.delayed(const Duration(milliseconds: pulseDuration * 3)); } - print('OFF'); ledPin.setValue(false); // pause between letters await Future.delayed(const Duration(milliseconds: pulseDuration)); } - print("SPACE BETWEEN LETTERS"); // space between letters is 3*pulseDuration await Future.delayed(const Duration(milliseconds: pulseDuration * 3)); } diff --git a/lib/features/news_api/data/models/teaser_image_url.dart b/lib/features/news_api/data/models/teaser_image_url.dart deleted file mode 100644 index 6daa0ef..0000000 --- a/lib/features/news_api/data/models/teaser_image_url.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; - -part 'teaser_image_url.freezed.dart'; -part 'teaser_image_url.g.dart'; - -@freezed -class TeaserImageUrl with _$TeaserImageUrl { - const factory TeaserImageUrl({ - String? imageurl, - }) = _TeaserImageUrl; - - factory TeaserImageUrl.fromJson(Map json) => - _$TeaserImageUrlFromJson(json); -} - -// old manual implementation: - -// class TeaserImageUrl { -// final String imageurl; - -// TeaserImageUrl({ -// required this.imageurl, -// }); - -// TeaserImageUrl copyWith({ -// String? imageurl, -// }) { -// return TeaserImageUrl( -// imageurl: imageurl ?? this.imageurl, -// ); -// } - -// Map toMap() { -// return { -// 'imageurl': imageurl, -// }; -// } - -// factory TeaserImageUrl.fromMap(Map map) { -// return TeaserImageUrl( -// imageurl: map['imageurl'] ?? '', -// ); -// } - -// String toJson() => json.encode(toMap()); - -// factory TeaserImageUrl.fromJson(String source) => -// TeaserImageUrl.fromMap(json.decode(source)); - -// @override -// String toString() => 'TeaserImageUrl(imageurl: $imageurl)'; - -// @override -// bool operator ==(Object other) { -// if (identical(this, other)) return true; - -// return other is TeaserImageUrl && other.imageurl == imageurl; -// } - -// @override -// int get hashCode => imageurl.hashCode; -// } diff --git a/lib/features/news_api/data/models/teaser_image_url.freezed.dart b/lib/features/news_api/data/models/teaser_image_url.freezed.dart deleted file mode 100644 index 05584d1..0000000 --- a/lib/features/news_api/data/models/teaser_image_url.freezed.dart +++ /dev/null @@ -1,154 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'teaser_image_url.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - -TeaserImageUrl _$TeaserImageUrlFromJson(Map json) { - return _TeaserImageUrl.fromJson(json); -} - -/// @nodoc -mixin _$TeaserImageUrl { - String? get imageurl => throw _privateConstructorUsedError; - - Map toJson() => throw _privateConstructorUsedError; - @JsonKey(ignore: true) - $TeaserImageUrlCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $TeaserImageUrlCopyWith<$Res> { - factory $TeaserImageUrlCopyWith( - TeaserImageUrl value, $Res Function(TeaserImageUrl) then) = - _$TeaserImageUrlCopyWithImpl<$Res, TeaserImageUrl>; - @useResult - $Res call({String? imageurl}); -} - -/// @nodoc -class _$TeaserImageUrlCopyWithImpl<$Res, $Val extends TeaserImageUrl> - implements $TeaserImageUrlCopyWith<$Res> { - _$TeaserImageUrlCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? imageurl = freezed, - }) { - return _then(_value.copyWith( - imageurl: freezed == imageurl - ? _value.imageurl - : imageurl // ignore: cast_nullable_to_non_nullable - as String?, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$TeaserImageUrlImplCopyWith<$Res> - implements $TeaserImageUrlCopyWith<$Res> { - factory _$$TeaserImageUrlImplCopyWith(_$TeaserImageUrlImpl value, - $Res Function(_$TeaserImageUrlImpl) then) = - __$$TeaserImageUrlImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({String? imageurl}); -} - -/// @nodoc -class __$$TeaserImageUrlImplCopyWithImpl<$Res> - extends _$TeaserImageUrlCopyWithImpl<$Res, _$TeaserImageUrlImpl> - implements _$$TeaserImageUrlImplCopyWith<$Res> { - __$$TeaserImageUrlImplCopyWithImpl( - _$TeaserImageUrlImpl _value, $Res Function(_$TeaserImageUrlImpl) _then) - : super(_value, _then); - - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? imageurl = freezed, - }) { - return _then(_$TeaserImageUrlImpl( - imageurl: freezed == imageurl - ? _value.imageurl - : imageurl // ignore: cast_nullable_to_non_nullable - as String?, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$TeaserImageUrlImpl implements _TeaserImageUrl { - const _$TeaserImageUrlImpl({this.imageurl}); - - factory _$TeaserImageUrlImpl.fromJson(Map json) => - _$$TeaserImageUrlImplFromJson(json); - - @override - final String? imageurl; - - @override - String toString() { - return 'TeaserImageUrl(imageurl: $imageurl)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$TeaserImageUrlImpl && - (identical(other.imageurl, imageurl) || - other.imageurl == imageurl)); - } - - @JsonKey(ignore: true) - @override - int get hashCode => Object.hash(runtimeType, imageurl); - - @JsonKey(ignore: true) - @override - @pragma('vm:prefer-inline') - _$$TeaserImageUrlImplCopyWith<_$TeaserImageUrlImpl> get copyWith => - __$$TeaserImageUrlImplCopyWithImpl<_$TeaserImageUrlImpl>( - this, _$identity); - - @override - Map toJson() { - return _$$TeaserImageUrlImplToJson( - this, - ); - } -} - -abstract class _TeaserImageUrl implements TeaserImageUrl { - const factory _TeaserImageUrl({final String? imageurl}) = - _$TeaserImageUrlImpl; - - factory _TeaserImageUrl.fromJson(Map json) = - _$TeaserImageUrlImpl.fromJson; - - @override - String? get imageurl; - @override - @JsonKey(ignore: true) - _$$TeaserImageUrlImplCopyWith<_$TeaserImageUrlImpl> get copyWith => - throw _privateConstructorUsedError; -} diff --git a/lib/features/news_api/data/models/teaser_image_url.g.dart b/lib/features/news_api/data/models/teaser_image_url.g.dart deleted file mode 100644 index dfecd58..0000000 --- a/lib/features/news_api/data/models/teaser_image_url.g.dart +++ /dev/null @@ -1,18 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'teaser_image_url.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$TeaserImageUrlImpl _$$TeaserImageUrlImplFromJson(Map json) => - _$TeaserImageUrlImpl( - imageurl: json['imageurl'] as String?, - ); - -Map _$$TeaserImageUrlImplToJson( - _$TeaserImageUrlImpl instance) => - { - 'imageurl': instance.imageurl, - }; diff --git a/lib/main.dart b/lib/main.dart index b7324a8..98cf138 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,5 +1,7 @@ import 'dart:io'; +// needed import if debugRepaintRainbowEnabled is used in main(): +// import 'package:flutter/rendering.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutterpi_gstreamer_video_player/flutterpi_gstreamer_video_player.dart'; import 'package:scaled_app/scaled_app.dart'; @@ -9,6 +11,8 @@ import 'app.dart'; import 'common/settings/sharedPrefs.dart'; void main() async { + // debugRepaintRainbowEnabled = true; + ScaledWidgetsFlutterBinding.ensureInitialized( scaleFactor: (deviceSize) { const double widthOfDesign = 960; diff --git a/pubspec.lock b/pubspec.lock index f7ad414..b06468e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -552,6 +552,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + linux_spidev: + dependency: "direct main" + description: + name: linux_spidev + sha256: b9a7f37d43c2e95793ad8ccb1b3f6753713ad16de79feae1e10e5140f4706e7f + url: "https://pub.dev" + source: hosted + version: "0.2.1+5" lists: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index fcca57f..e6e94ca 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -53,6 +53,7 @@ dependencies: simple_tiles_map: ^1.3.4 flutter_map: ^5.0.0 video_player: ^2.8.2 + linux_spidev: ^0.2.1+5 dev_dependencies: flutter_test: @@ -89,8 +90,6 @@ flutter: - assets/images/flame_benchmark/sprite_benchmark/ - assets/img/ - assets/video/ - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg shaders: - shaders/aobench.frag diff --git a/uml.txt b/uml.txt new file mode 100644 index 0000000..434331e --- /dev/null +++ b/uml.txt @@ -0,0 +1,1374 @@ +@startuml +abstract class TestUserDefaultsApi { +codec: MessageCodec +--- +-_testBinaryMessengerBinding(): TestDefaultBinaryMessengerBinding? +remove(): void +setBool(): void +setDouble(): void +setValue(): void +getAll(): Map +clear(): bool +setup(): void +} +TestUserDefaultsApi ..> MessageCodec +class _MockSharedPreferencesApi { +items: Map +--- +getAll(): Map +remove(): void +setBool(): void +setDouble(): void +setValue(): void +clear(): bool +} +_MockSharedPreferencesApi ..|> TestUserDefaultsApi +class MyApp { +--- +build(): Widget +} +StatelessWidget <|-- MyApp +class SharedPreferencesDemo { +--- +createState(): SharedPreferencesDemoState +} +StatefulWidget <|-- SharedPreferencesDemo +class SharedPreferencesDemoState { +-_prefs: SharedPreferencesStorePlatform +-_counter: Future +-_prefKey: String +--- +-_incrementCounter(): Future +initState(): void +build(): Widget +} +State <|-- SharedPreferencesDemoState +SharedPreferencesDemoState ..> SharedPreferencesStorePlatform +SharedPreferencesDemoState ..> Future +abstract class UserDefaultsApi { +--- +remove(): void +setBool(): void +setDouble(): void +setValue(): void +getAll(): Map +clear(): bool +} +class SharedPreferencesFoundation { +-_api: UserDefaultsApi +-_defaultPrefix: String +-_setters: Map +--- +registerWith(): void +clear(): Future +clearWithPrefix(): Future +clearWithParameters(): Future +getAll(): Future> +getAllWithPrefix(): Future> +getAllWithParameters(): Future> +remove(): Future +setValue(): Future +} +SharedPreferencesStorePlatform <|-- SharedPreferencesFoundation +SharedPreferencesFoundation ..> UserDefaultsApi +class UserDefaultsApi { +-_binaryMessenger: BinaryMessenger? +codec: MessageCodec +--- +remove(): Future +setBool(): Future +setDouble(): Future +setValue(): Future +getAll(): Future> +clear(): Future +} +UserDefaultsApi ..> BinaryMessenger +UserDefaultsApi ..> MessageCodec +class _ApiLogger { +log: List +textureMessage: TextureMessage? +createMessage: CreateMessage? +positionMessage: PositionMessage? +loopingMessage: LoopingMessage? +volumeMessage: VolumeMessage? +playbackSpeedMessage: PlaybackSpeedMessage? +mixWithOthersMessage: MixWithOthersMessage? +--- +create(): TextureMessage +dispose(): void +initialize(): void +pause(): void +play(): void +setMixWithOthers(): void +position(): PositionMessage +seekTo(): Future +setLooping(): void +setVolume(): void +setPlaybackSpeed(): void +} +_ApiLogger ..> TextureMessage +_ApiLogger ..> CreateMessage +_ApiLogger ..> PositionMessage +_ApiLogger ..> LoopingMessage +_ApiLogger ..> VolumeMessage +_ApiLogger ..> PlaybackSpeedMessage +_ApiLogger ..> MixWithOthersMessage +_ApiLogger ..|> TestHostVideoPlayerApi +class _TestHostVideoPlayerApiCodec { +--- +writeValue(): void +readValueOfType(): Object? +} +StandardMessageCodec <|-- _TestHostVideoPlayerApiCodec +abstract class TestHostVideoPlayerApi { +codec: MessageCodec +--- +-_testBinaryMessengerBinding(): TestDefaultBinaryMessengerBinding? +initialize(): void +create(): TextureMessage +dispose(): void +setLooping(): void +setVolume(): void +setPlaybackSpeed(): void +play(): void +position(): PositionMessage +seekTo(): Future +pause(): void +setMixWithOthers(): void +setup(): void +} +TestHostVideoPlayerApi ..> MessageCodec +class VideoPlayerValue { +duration: Duration +position: Duration +buffered: List +isPlaying: bool +isBuffering: bool +playbackSpeed: double +errorDescription: String? +size: Size +isInitialized: bool +--- +hasError(): bool +aspectRatio(): double +copyWith(): VideoPlayerValue +==(): bool +hashCode(): int +} +VideoPlayerValue ..> Size +class MiniController { +dataSource: String +dataSourceType: DataSourceType +package: String? +-_timer: Timer? +-_creatingCompleter: Completer? +-_eventSubscription: StreamSubscription? +kUninitializedTextureId: int +-_textureId: int +--- +textureId(): int +initialize(): Future +dispose(): Future +play(): Future +pause(): Future +-_applyPlayPause(): Future +-_applyPlaybackSpeed(): Future +position(): Future +seekTo(): Future +setPlaybackSpeed(): Future +-_updatePosition(): void +} +ValueNotifier <|-- MiniController +MiniController ..> DataSourceType +MiniController ..> Timer +class VideoPlayer { +controller: MiniController +--- +createState(): State +} +StatefulWidget <|-- VideoPlayer +VideoPlayer ..> MiniController +class _VideoPlayerState { +-_listener: VoidCallback +-_textureId: int +--- +initState(): void +didUpdateWidget(): void +deactivate(): void +build(): Widget +} +State <|-- _VideoPlayerState +_VideoPlayerState ..> VoidCallback +class _VideoScrubber { +child: Widget +controller: MiniController +--- +createState(): _VideoScrubberState +} +StatefulWidget <|-- _VideoScrubber +_VideoScrubber ..> Widget +_VideoScrubber ..> MiniController +class _VideoScrubberState { +--- +controller(): MiniController +build(): Widget +} +State <|-- _VideoScrubberState +class VideoProgressIndicator { +controller: MiniController +--- +createState(): State +} +StatefulWidget <|-- VideoProgressIndicator +VideoProgressIndicator ..> MiniController +class _VideoProgressIndicatorState { +listener: VoidCallback +--- +controller(): MiniController +initState(): void +deactivate(): void +build(): Widget +} +State <|-- _VideoProgressIndicatorState +_VideoProgressIndicatorState ..> VoidCallback +class _App { +--- +build(): Widget +} +StatelessWidget <|-- _App +class _ButterFlyAssetVideo { +--- +createState(): _ButterFlyAssetVideoState +} +StatefulWidget <|-- _ButterFlyAssetVideo +class _ButterFlyAssetVideoState { +-_controller: MiniController +--- +initState(): void +dispose(): void +build(): Widget +} +State <|-- _ButterFlyAssetVideoState +_ButterFlyAssetVideoState ..> MiniController +class _BumbleBeeRemoteVideo { +--- +createState(): _BumbleBeeRemoteVideoState +} +StatefulWidget <|-- _BumbleBeeRemoteVideo +class _BumbleBeeRemoteVideoState { +-_controller: MiniController +--- +initState(): void +dispose(): void +build(): Widget +} +State <|-- _BumbleBeeRemoteVideoState +_BumbleBeeRemoteVideoState ..> MiniController +class _BumbleBeeEncryptedLiveStream { +--- +createState(): _BumbleBeeEncryptedLiveStreamState +} +StatefulWidget <|-- _BumbleBeeEncryptedLiveStream +class _BumbleBeeEncryptedLiveStreamState { +-_controller: MiniController +--- +initState(): void +dispose(): void +build(): Widget +} +State <|-- _BumbleBeeEncryptedLiveStreamState +_BumbleBeeEncryptedLiveStreamState ..> MiniController +class _ControlsOverlay { +-_examplePlaybackRates: List +controller: MiniController +--- +build(): Widget +} +StatelessWidget <|-- _ControlsOverlay +_ControlsOverlay ..> MiniController +class TextureMessage { +textureId: int +--- +} +class LoopingMessage { +textureId: int +isLooping: bool +--- +} +class VolumeMessage { +textureId: int +volume: double +--- +} +class PlaybackSpeedMessage { +textureId: int +speed: double +--- +} +class PositionMessage { +textureId: int +position: int +--- +} +class CreateMessage { +asset: String? +uri: String? +packageName: String? +formatHint: String? +httpHeaders: Map +--- +} +class MixWithOthersMessage { +mixWithOthers: bool +--- +} +abstract class AVFoundationVideoPlayerApi { +--- +initialize(): void +create(): TextureMessage +dispose(): void +setLooping(): void +setVolume(): void +setPlaybackSpeed(): void +play(): void +position(): PositionMessage +seekTo(): void +pause(): void +setMixWithOthers(): void +} +class AVFoundationVideoPlayer { +-_api: AVFoundationVideoPlayerApi +-_videoFormatStringMap: Map +--- +registerWith(): void +init(): Future +dispose(): Future +create(): Future +setLooping(): Future +play(): Future +pause(): Future +setVolume(): Future +setPlaybackSpeed(): Future +seekTo(): Future +getPosition(): Future +videoEventsFor(): Stream +buildView(): Widget +setMixWithOthers(): Future +-_eventChannelFor(): EventChannel +-_toDurationRange(): DurationRange +} +VideoPlayerPlatform <|-- AVFoundationVideoPlayer +AVFoundationVideoPlayer ..> AVFoundationVideoPlayerApi +class TextureMessage { +textureId: int +--- +encode(): Object +decode(): TextureMessage +} +class LoopingMessage { +textureId: int +isLooping: bool +--- +encode(): Object +decode(): LoopingMessage +} +class VolumeMessage { +textureId: int +volume: double +--- +encode(): Object +decode(): VolumeMessage +} +class PlaybackSpeedMessage { +textureId: int +speed: double +--- +encode(): Object +decode(): PlaybackSpeedMessage +} +class PositionMessage { +textureId: int +position: int +--- +encode(): Object +decode(): PositionMessage +} +class CreateMessage { +asset: String? +uri: String? +packageName: String? +formatHint: String? +httpHeaders: Map +--- +encode(): Object +decode(): CreateMessage +} +class MixWithOthersMessage { +mixWithOthers: bool +--- +encode(): Object +decode(): MixWithOthersMessage +} +class _AVFoundationVideoPlayerApiCodec { +--- +writeValue(): void +readValueOfType(): Object? +} +StandardMessageCodec <|-- _AVFoundationVideoPlayerApiCodec +class AVFoundationVideoPlayerApi { +-_binaryMessenger: BinaryMessenger? +codec: MessageCodec +--- +initialize(): Future +create(): Future +dispose(): Future +setLooping(): Future +setVolume(): Future +setPlaybackSpeed(): Future +play(): Future +position(): Future +seekTo(): Future +pause(): Future +setMixWithOthers(): Future +} +AVFoundationVideoPlayerApi ..> BinaryMessenger +AVFoundationVideoPlayerApi ..> MessageCodec +class FakePathProviderLinux { +--- +getApplicationSupportPath(): Future +getTemporaryPath(): Future +getLibraryPath(): Future +getApplicationDocumentsPath(): Future +getDownloadsPath(): Future +} +PathProviderPlatform <|-- FakePathProviderLinux +FakePathProviderLinux ..|> PathProviderLinux +class MyApp { +--- +build(): Widget +} +StatelessWidget <|-- MyApp +class SharedPreferencesDemo { +--- +createState(): SharedPreferencesDemoState +} +StatefulWidget <|-- SharedPreferencesDemo +class SharedPreferencesDemoState { +prefs: SharedPreferencesLinux +-_counter: Future +--- +-_incrementCounter(): Future +initState(): void +build(): Widget +} +State <|-- SharedPreferencesDemoState +SharedPreferencesDemoState ..> SharedPreferencesLinux +SharedPreferencesDemoState ..> Future +class SharedPreferencesLinux { +instance: SharedPreferencesLinux +-_defaultPrefix: String +-_cachedPreferences: Map? +fs: FileSystem +pathProvider: PathProviderLinux +--- +registerWith(): void +-_getLocalDataFile(): Future +-_reload(): Future> +-_readPreferences(): Future> +-_writePreferences(): Future +clear(): Future +clearWithPrefix(): Future +clearWithParameters(): Future +getAll(): Future> +getAllWithPrefix(): Future> +getAllWithParameters(): Future> +remove(): Future +setValue(): Future +} +SharedPreferencesStorePlatform <|-- SharedPreferencesLinux +SharedPreferencesLinux ..> SharedPreferencesLinux +SharedPreferencesLinux ..> FileSystem +SharedPreferencesLinux ..> PathProviderLinux +class _FakeGioUtils { +application: int? +applicationId: Pointer? +libraryIsPresent: bool +--- +gApplicationGetDefault(): int +gApplicationGetApplicationId(): Pointer +} +_FakeGioUtils ..> Pointer +_FakeGioUtils ..|> GioUtils +class MyApp { +--- +createState(): State +} +StatefulWidget <|-- MyApp +class _MyAppState { +-_tempDirectory: String? +-_downloadsDirectory: String? +-_appSupportDirectory: String? +-_appCacheDirectory: String? +-_documentsDirectory: String? +-_provider: PathProviderLinux +--- +initState(): void +initDirectories(): Future +build(): Widget +} +State <|-- _MyAppState +_MyAppState ..> PathProviderLinux +class PathProviderLinux { +-_environment: Map +-_executableName: String? +-_applicationId: String? +--- +registerWith(): void +getTemporaryPath(): Future +getApplicationSupportPath(): Future +getApplicationDocumentsPath(): Future +getApplicationCachePath(): Future +getDownloadsPath(): Future +-_getExecutableName(): Future +-_getId(): Future +} +PathProviderPlatform <|-- PathProviderLinux +class GioUtils { +-_gio: DynamicLibrary? +--- +libraryIsPresent(): bool +gApplicationGetDefault(): int +gApplicationGetApplicationId(): Pointer +} +GioUtils ..> DynamicLibrary +abstract class VirtualKeyboardLayoutKeys { +activeIndex: int +--- +defaultEnglishLayout(): List +defaultArabicLayout(): List +activeLayout(): List +getLanguagesCount(): int +getLanguage(): List +switchLanguage(): void +} +class VirtualKeyboardDefaultLayoutKeys { +defaultLayouts: List +--- +getLanguagesCount(): int +getLanguage(): List +} +VirtualKeyboardLayoutKeys <|-- VirtualKeyboardDefaultLayoutKeys +class VirtualKeyboard { +type: VirtualKeyboardType +onKeyPress: Function? +onReturnKey: Function? +height: double +width: double? +textColor: Color +fontSize: double +customLayoutKeys: VirtualKeyboardLayoutKeys? +textController: TextEditingController? +builder: Widget Function(BuildContext context, VirtualKeyboardKey key)? +alwaysCaps: bool +reverseLayout: bool +unfocus: bool +defaultLayouts: List? +--- +createState(): State +} +StatefulWidget <|-- VirtualKeyboard +VirtualKeyboard ..> VirtualKeyboardType +VirtualKeyboard ..> Function +VirtualKeyboard ..> Color +VirtualKeyboard ..> VirtualKeyboardLayoutKeys +VirtualKeyboard ..> TextEditingController +class _VirtualKeyboardState { +type: VirtualKeyboardType +onKeyPress: Function? +onReturnKey: Function? +textController: TextEditingController +builder: Widget Function(BuildContext context, VirtualKeyboardKey key)? +height: double +width: double? +textColor: Color +fontSize: double +alwaysCaps: bool +reverseLayout: bool +unfocus: bool +customLayoutKeys: VirtualKeyboardLayoutKeys +textStyle: TextStyle +isShiftEnabled: bool +longPress: bool +--- +-_onKeyPress(): void +dispose(): void +didUpdateWidget(): void +initState(): void +build(): Widget +-_insertKeyAtPosition(): void +-_alphanumeric(): Widget +-_numeric(): Widget +-_rows(): List +-_keyboardDefaultKey(): Widget +-_keyboardDefaultActionKey(): Widget +} +State <|-- _VirtualKeyboardState +_VirtualKeyboardState ..> VirtualKeyboardType +_VirtualKeyboardState ..> Function +_VirtualKeyboardState ..> TextEditingController +_VirtualKeyboardState ..> Color +_VirtualKeyboardState ..> VirtualKeyboardLayoutKeys +_VirtualKeyboardState ..> TextStyle +class VirtualKeyboardKey { +text: String? +capsText: String? +keyType: VirtualKeyboardKeyType +action: VirtualKeyboardKeyAction? +--- +} +VirtualKeyboardKey ..> VirtualKeyboardKeyType +VirtualKeyboardKey ..> VirtualKeyboardKeyAction +class Point { +x: T +y: T +--- +toString(): String +} +Point ..> T +class ChartPainter { +data: List> +maxY: double +context: BuildContext +--- +paint(): void +paintRect(): void +shouldRepaint(): bool +} +CustomPainter <|-- ChartPainter +ChartPainter ..> BuildContext +class RealTimeChart { +stream: Stream +maxY: double +valueDesc: String +valueType: String +maxValueDesc: String? +maxValueType: String? +updateDelay: Duration +speed: int +--- +createState(): State +} +StatefulWidget <|-- RealTimeChart +RealTimeChart ..> Stream +class _RealTimeChartState { +-_streamSubscription: StreamSubscription? +data: List> +timer: Timer? +--- +initState(): void +dispose(): void +-_streamListener(): void +build(): Widget +} +State <|-- _RealTimeChartState +_RealTimeChartState ..> Timer +class TagesschauApiUrls { +main: null +news: null +placeholderImage: null +logoImage: null +--- +} +class EnemyComponent { +speed: null +initialSize: Vector2 +--- +onLoad(): Future +update(): void +takeHit(): void +} +SpriteAnimationComponent <|-- EnemyComponent +EnemyComponent ..> Vector2 +class EnemyCreator { +random: Random +-_halfWidth: null +--- +onTick(): void +} +TimerComponent <|-- EnemyCreator +EnemyCreator ..> Random +class StarComponent { +speed: null +--- +update(): void +} +SpriteAnimationComponent <|-- StarComponent +class PlayerComponent { +bulletCreator: TimerComponent +-_bulletAngles: null +--- +onLoad(): Future +-_createBullet(): void +beginFire(): void +stopFire(): void +takeHit(): void +onCollisionStart(): void +} +SpriteAnimationComponent <|-- PlayerComponent +PlayerComponent ..> TimerComponent +class StarBackGroundCreator { +gapSize: null +spriteSheet: SpriteSheet +random: Random +--- +onLoad(): Future +-_createStarAt(): void +-_createRowOfStars(): void +-_createInitialStars(): void +} +Component <|-- StarBackGroundCreator +StarBackGroundCreator ..> SpriteSheet +StarBackGroundCreator ..> Random +class BulletComponent { +speed: null +velocity: Vector2 +deltaPosition: Vector2 +--- +onLoad(): Future +onCollisionStart(): void +update(): void +} +SpriteAnimationComponent <|-- BulletComponent +BulletComponent ..> Vector2 +class ExplosionComponent { +--- +onLoad(): Future +} +SpriteAnimationComponent <|-- ExplosionComponent +class RogueShooterWidget { +--- +build(): Widget +} +StatelessWidget <|-- RogueShooterWidget +class RogueShooterGame { +description: String +-_player: PlayerComponent +-_componentCounter: TextComponent +-_scoreText: TextComponent +-_updateTime: null +-_renderTime: TextComponent +-_score: int +--- +onLoad(): Future +update(): void +onPanStart(): void +onPanEnd(): void +onPanCancel(): void +onPanUpdate(): void +increaseScore(): void +} +FlameGame <|-- RogueShooterGame +RogueShooterGame ..> PlayerComponent +RogueShooterGame ..> TextComponent +class SpriteBenchmark { +description: null +countdown: null +emberSize: null +emberCounter: TextComponent +counterPrefix: null +posX: double +posY: double +window: Queue +-_sum: double +spriteCount: int +windowSize: int +textPaint: TextPaint +--- +backgroundColor(): Color +onLoad(): Future +fps(): double +update(): void +} +FlameGame <|-- SpriteBenchmark +SpriteBenchmark ..> TextComponent +SpriteBenchmark ..> Queue +SpriteBenchmark ..> TextPaint +class BenchmarkWorld { +random: Random +--- +onTapDown(): void +} +World <|-- BenchmarkWorld +BenchmarkWorld ..> Random +class Ember { +--- +onLoad(): Future +} +SpriteAnimationComponent <|-- Ember +class Benchmark { +title: String +desc: String +buttonText: String +route: RoutesBenchmark +--- +} +Benchmark ..> RoutesBenchmark +class BenchmarkScreen { +--- +build(): Widget +} +StatelessWidget <|-- BenchmarkScreen +class SpriteBenchmarkScreen { +--- +build(): Widget +} +StatelessWidget <|-- SpriteBenchmarkScreen +class VideoBenchmarkScreen { +--- +createState(): State +} +StatefulWidget <|-- VideoBenchmarkScreen +class _VideoBenchmarkScreenState { +-_controller: VideoPlayerController +selectedMode: String +--- +initState(): void +dispose(): void +build(): Widget +} +State <|-- _VideoBenchmarkScreenState +_VideoBenchmarkScreenState ..> VideoPlayerController +class RogueShooterScreen { +--- +createState(): State +} +StatefulWidget <|-- RogueShooterScreen +class _RogueShooterScreenState { +--- +build(): Widget +} +State <|-- _RogueShooterScreenState +class VsyncBenchmarkScreen { +--- +build(): Widget +} +StatelessWidget <|-- VsyncBenchmarkScreen +class ShaderHomePage { +--- +createState(): State +} +StatefulWidget <|-- ShaderHomePage +class _ShaderHomePageState { +delta: double +shader: FragmentShader? +-_ticker: Ticker +--- +loadMyShader(): void +initState(): void +dispose(): void +build(): Widget +} +State <|-- _ShaderHomePageState +_ShaderHomePageState ..> FragmentShader +_ShaderHomePageState ..> Ticker +class ShaderPainter { +shader: FragmentShader +time: double +--- +paint(): void +shouldRepaint(): bool +} +CustomPainter <|-- ShaderPainter +ShaderPainter ..> FragmentShader +class MapBenchmarkScreen { +--- +createState(): State +} +StatefulWidget <|-- MapBenchmarkScreen +class _MapBenchmarkScreenState { +-_typeMap: TypeMap +--- +build(): Widget +} +State <|-- _MapBenchmarkScreenState +_MapBenchmarkScreenState ..> TypeMap +class BenchmarkCard { +benchmark: Benchmark +--- +build(): Widget +} +StatelessWidget <|-- BenchmarkCard +BenchmarkCard ..> Benchmark +class WifiController { +--- +build(): Future +-_device(): NetworkManagerDevice +wifiStream(): Stream<(NetworkManagerDevice, NetworkManagerClient)> +disconnectFromWifiNetwork(): void +connectToWifiNetwork(): void +} +_$WifiController <|-- WifiController +class SettingsScreen { +--- +build(): Widget +} +ConsumerWidget <|-- SettingsScreen +class ColorSeedButton { +--- +build(): Widget +} +ConsumerWidget <|-- ColorSeedButton +class WifiSettingsScreen { +--- +build(): Widget +} +ConsumerWidget <|-- WifiSettingsScreen +class AccessPointScreen { +accessPoint: NetworkManagerAccessPoint? +--- +build(): Widget +} +ConsumerWidget <|-- AccessPointScreen +AccessPointScreen ..> NetworkManagerAccessPoint +class AccessPointPasswordDialog { +accessPoint: NetworkManagerAccessPoint? +--- +build(): Widget +} +ConsumerWidget <|-- AccessPointPasswordDialog +AccessPointPasswordDialog ..> NetworkManagerAccessPoint +class AccessPointTileDemo { +--- +build(): Widget +} +ConsumerWidget <|-- AccessPointTileDemo +class AccessPointTile { +accessPoint: NetworkManagerAccessPoint +client: NetworkManagerClient +device: NetworkManagerDevice +--- +build(): Widget +} +ConsumerWidget <|-- AccessPointTile +AccessPointTile ..> NetworkManagerAccessPoint +AccessPointTile ..> NetworkManagerClient +AccessPointTile ..> NetworkManagerDevice +class WifiBarIcon { +strength: int +size: double? +color: Color? +--- +build(): Widget +} +StatelessWidget <|-- WifiBarIcon +WifiBarIcon ..> Color +class HomeScreen { +--- +createState(): State +} +StatefulWidget <|-- HomeScreen +class _HomeScreenState { +--- +initState(): void +build(): Widget +} +State <|-- _HomeScreenState +class MaterialDemoScreen { +--- +createState(): State +} +StatefulWidget <|-- MaterialDemoScreen +class _MaterialDemoScreenState { +switch1: bool +switch2: bool +sliderValue1: double +sliderValue2: double +navBarIndex: int +indicatorPlayAnimation: bool +--- +build(): Widget +} +State <|-- _MaterialDemoScreenState +class ComponentDecoration { +child: Widget +title: String +--- +build(): Widget +} +StatelessWidget <|-- ComponentDecoration +ComponentDecoration ..> Widget +class ScrollStateController { +--- +build(): bool +toggle(): void +} +_$ScrollStateController <|-- ScrollStateController +class NewsController { +--- +build(): Future +appendPage(): Future +} +_$NewsController <|-- NewsController +class NewsRepository { +-_dio: Dio +--- +fetchNews(): Future +fetchNewsPage(): void +-_extractDate(): String +} +NewsRepository ..> Dio +abstract class $NewsCopyWith { +--- +call(): $Res +teaserImage(): $TeaserImageCopyWith<$Res>? +brandingImage(): $TeaserImageCopyWith<$Res>? +} +class _$NewsCopyWithImpl { +-_value: $Val +-_then: $Res Function($Val) +--- +call(): $Res +teaserImage(): $TeaserImageCopyWith<$Res>? +brandingImage(): $TeaserImageCopyWith<$Res>? +} +_$NewsCopyWithImpl ..> $Val +_$NewsCopyWithImpl ..|> $NewsCopyWith +abstract class _$$NewsImplCopyWith { +--- +call(): $Res +teaserImage(): $TeaserImageCopyWith<$Res>? +brandingImage(): $TeaserImageCopyWith<$Res>? +} +_$$NewsImplCopyWith ..|> $NewsCopyWith +class __$$NewsImplCopyWithImpl { +--- +call(): $Res +} +_$NewsCopyWithImpl <|-- __$$NewsImplCopyWithImpl +__$$NewsImplCopyWithImpl ..|> _$$NewsImplCopyWith +class _$NewsImpl { +title: String? +teaserImage: TeaserImage? +brandingImage: TeaserImage? +date: String? +type: String? +--- +toString(): String +debugFillProperties(): void +==(): bool +hashCode(): int +copyWith(): _$$NewsImplCopyWith<_$NewsImpl> +toJson(): Map +} +_$NewsImpl ..> TeaserImage +_$NewsImpl ..|> _News +abstract class _News { +--- +title(): String? +teaserImage(): TeaserImage? +brandingImage(): TeaserImage? +date(): String? +type(): String? +copyWith(): _$$NewsImplCopyWith<_$NewsImpl> +} +_News ..|> News +abstract class $TeaserImageCopyWith { +--- +call(): $Res +} +class _$TeaserImageCopyWithImpl { +-_value: $Val +-_then: $Res Function($Val) +--- +call(): $Res +} +_$TeaserImageCopyWithImpl ..> $Val +_$TeaserImageCopyWithImpl ..|> $TeaserImageCopyWith +abstract class _$$TeaserImageImplCopyWith { +--- +call(): $Res +} +_$$TeaserImageImplCopyWith ..|> $TeaserImageCopyWith +class __$$TeaserImageImplCopyWithImpl { +--- +call(): $Res +} +_$TeaserImageCopyWithImpl <|-- __$$TeaserImageImplCopyWithImpl +__$$TeaserImageImplCopyWithImpl ..|> _$$TeaserImageImplCopyWith +class _$TeaserImageImpl { +-_imageVariants: Map? +--- +imageVariants(): Map? +toString(): String +==(): bool +hashCode(): int +copyWith(): _$$TeaserImageImplCopyWith<_$TeaserImageImpl> +toJson(): Map +} +_$TeaserImageImpl ..|> _TeaserImage +abstract class _TeaserImage { +--- +imageVariants(): Map? +copyWith(): _$$TeaserImageImplCopyWith<_$TeaserImageImpl> +} +_TeaserImage ..|> TeaserImage +class News { +--- +} +class TeaserImage { +--- +} +class RegionNews { +--- +} +abstract class $RegionNewsCopyWith { +--- +call(): $Res +} +class _$RegionNewsCopyWithImpl { +-_value: $Val +-_then: $Res Function($Val) +--- +call(): $Res +} +_$RegionNewsCopyWithImpl ..> $Val +_$RegionNewsCopyWithImpl ..|> $RegionNewsCopyWith +abstract class _$$RegionNewsImplCopyWith { +--- +call(): $Res +} +_$$RegionNewsImplCopyWith ..|> $RegionNewsCopyWith +class __$$RegionNewsImplCopyWithImpl { +--- +call(): $Res +} +_$RegionNewsCopyWithImpl <|-- __$$RegionNewsImplCopyWithImpl +__$$RegionNewsImplCopyWithImpl ..|> _$$RegionNewsImplCopyWith +class _$RegionNewsImpl { +-_news: List +nextPage: String? +--- +news(): List +toString(): String +debugFillProperties(): void +==(): bool +hashCode(): int +copyWith(): _$$RegionNewsImplCopyWith<_$RegionNewsImpl> +toJson(): Map +} +_$RegionNewsImpl ..|> _RegionNews +abstract class _RegionNews { +--- +news(): List +nextPage(): String? +copyWith(): _$$RegionNewsImplCopyWith<_$RegionNewsImpl> +} +_RegionNews ..|> RegionNews +class NewsScreen { +--- +createState(): State +} +StatefulWidget <|-- NewsScreen +class _NewsScreenState { +-_isGrid: bool +--- +build(): Widget +} +State <|-- _NewsScreenState +class NewsGridItem { +news: News +--- +build(): Widget +} +StatelessWidget <|-- NewsGridItem +NewsGridItem ..> News +class NewsListItem { +news: News +--- +build(): Widget +} +StatelessWidget <|-- NewsListItem +NewsListItem ..> News +class NewsGrid { +scrollController: ScrollController +--- +-_isBottom(): bool +-_hasScrolledDown(): bool +build(): Widget +} +ConsumerWidget <|-- NewsGrid +NewsGrid ..> ScrollController +class NewsList { +scrollController: ScrollController +--- +-_isBottom(): bool +-_hasScrolledDown(): bool +build(): Widget +} +ConsumerWidget <|-- NewsList +NewsList ..> ScrollController +class MorseService { +-_chips: null +-_morseAlphabet: Map +--- +printMessage(): void +-_getRaspberryGPIO(): GpioChip +} +class LedScreen { +--- +build(): Widget +} +ConsumerWidget <|-- LedScreen +class MatrixService { +spi: null +--- +setLedsOn(): void +} +class Pixel { +offset: Offset +color: Color +--- +} +Pixel ..> Offset +Pixel ..> Color +class PixelPainter { +pixels: List +--- +paint(): void +shouldRepaint(): bool +} +CustomPainter <|-- PixelPainter +class MatrixScreen { +--- +createState(): State +} +StatefulWidget <|-- MatrixScreen +class _MatrixScreenState { +pixels: List +color: Color +--- +-_updatePixel(): void +build(): Widget +} +State <|-- _MatrixScreenState +_MatrixScreenState ..> Color +class MemoryService { +--- +build(): Future +freeMemory(): Stream +} +_$MemoryService <|-- MemoryService +class SystemResourcesScreen { +--- +build(): Widget +} +ConsumerWidget <|-- SystemResourcesScreen +class SharedPrefs { +-_sharedPrefs: SharedPreferences +-_instance: SharedPrefs +--- +init(): Future +setValue(): void +getValue(): dynamic +} +SharedPrefs ..> SharedPreferences +SharedPrefs ..> SharedPrefs +class UseMaterial3 { +--- +build(): bool +toggle(): void +} +_$UseMaterial3 <|-- UseMaterial3 +class UseDarkMode { +--- +build(): bool +toggle(): void +} +_$UseDarkMode <|-- UseDarkMode +class ColorSeedSelected { +--- +build(): ColorSeed +setColorSeed(): void +} +_$ColorSeedSelected <|-- ColorSeedSelected +class ShowPerformanceOverlay { +--- +build(): bool +toggle(): void +} +_$ShowPerformanceOverlay <|-- ShowPerformanceOverlay +class CustomLayoutKeys { +--- +getLanguagesCount(): int +getLanguage(): List +} +VirtualKeyboardLayoutKeys <|-- CustomLayoutKeys +class FadeTransitionPage { +-_curveTween: CurveTween +--- +} +CustomTransitionPage <|-- FadeTransitionPage +FadeTransitionPage ..> CurveTween +class MenuDrawer { +--- +build(): Widget +} +StatelessWidget <|-- MenuDrawer +class ScaffoldWithStatusbar { +appBar: AppBar? +body: Widget? +floatingActionButton: FloatingActionButton? +--- +build(): Widget +} +StatelessWidget <|-- ScaffoldWithStatusbar +ScaffoldWithStatusbar ..> AppBar +ScaffoldWithStatusbar ..> Widget +ScaffoldWithStatusbar ..> FloatingActionButton +class HomeScaffold { +selectedTab: RoutesHome +child: Widget +appBar: AppBar? +--- +build(): Widget +} +StatelessWidget <|-- HomeScaffold +HomeScaffold ..> RoutesHome +HomeScaffold ..> Widget +HomeScaffold ..> AppBar +class TextInputDialog { +controller: TextEditingController +title: String +onReturnPress: Function? +hintText: String? +--- +build(): Widget +} +ConsumerWidget <|-- TextInputDialog +TextInputDialog ..> TextEditingController +TextInputDialog ..> Function +class StatusBar { +--- +build(): Widget +} +ConsumerWidget <|-- StatusBar +class ClockWidget { +textStyle: TextStyle? +--- +build(): Widget +} +ConsumerWidget <|-- ClockWidget +ClockWidget ..> TextStyle +class FloatingMenuButton { +popupMenuButton: PopupMenuButton? +--- +build(): Widget +} +StatelessWidget <|-- FloatingMenuButton +FloatingMenuButton ..> PopupMenuButton +class App { +--- +build(): Widget +} +ConsumerWidget <|-- App +@enduml \ No newline at end of file