From 60b4e2cb59cd04ba03faf8e04d0c5b3a7034009c Mon Sep 17 00:00:00 2001 From: domib97 Date: Sun, 19 Apr 2026 21:11:17 +0200 Subject: [PATCH 1/2] prod v2 --- lib/settings_page.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/settings_page.dart b/lib/settings_page.dart index bff0f0e..04ac195 100755 --- a/lib/settings_page.dart +++ b/lib/settings_page.dart @@ -71,7 +71,7 @@ class _SettingsPageState extends ConsumerState { : "Inaktiv: Lokale Simulation"), secondary: const FaIcon(FontAwesomeIcons.ethereum), // Ethereum Icon als Platzhalter für Crypto value: useCardano, - activeThumbColor: Colors.orange, + activeThumbColor: Colors.blueAccent, onChanged: (value) { ref.read(useCardanoBackendProvider.notifier).toggle(value); }, @@ -87,7 +87,7 @@ class _SettingsPageState extends ConsumerState { ), ListTile( title: const Text('About'), - subtitle: const Text('Version 2.0 - Web3 Ready'), + subtitle: const Text('Version 0.1 - Prod'), trailing: const FaIcon(FontAwesomeIcons.circleInfo), onTap: () { // Show about dialog From 4bf327c3ae7fd37a8e9f22070c3749c0146c5a57 Mon Sep 17 00:00:00 2001 From: domib97 Date: Wed, 20 May 2026 18:45:24 +0200 Subject: [PATCH 2/2] Antigravity --- android/NOTICE | 190 ++++++++++++++++++++++++++++++ android/build.gradle | 19 ++- lib/chat_page.dart | 19 --- lib/inbox_page.dart | 25 +--- lib/main.dart | 147 +++++++++++++++-------- lib/note_page.dart | 14 +-- lib/providers/theme_provider.dart | 27 +++++ lib/settings_page.dart | 9 +- pubspec.lock | 32 ++--- 9 files changed, 354 insertions(+), 128 deletions(-) create mode 100755 android/NOTICE create mode 100644 lib/providers/theme_provider.dart diff --git a/android/NOTICE b/android/NOTICE new file mode 100755 index 0000000..06a9081 --- /dev/null +++ b/android/NOTICE @@ -0,0 +1,190 @@ + + Copyright (c) 2005-2014, The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + diff --git a/android/build.gradle b/android/build.gradle index bc157bd..3dd73a5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,3 +1,17 @@ +buildscript { + ext.kotlin_version = '1.9.0' + + repositories { + google() + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:7.4.2' // ← war 8.2.0 + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + allprojects { repositories { google() @@ -6,13 +20,12 @@ allprojects { } rootProject.buildDir = '../build' + subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { project.evaluationDependsOn(':app') } tasks.register("clean", Delete) { delete rootProject.buildDir -} +} \ No newline at end of file diff --git a/lib/chat_page.dart b/lib/chat_page.dart index 55c0984..706e035 100755 --- a/lib/chat_page.dart +++ b/lib/chat_page.dart @@ -1,24 +1,5 @@ import 'package:flutter/material.dart'; -void main() { - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Chats', - theme: ThemeData( - primarySwatch: Colors.green, - ), - home: const ChatScreen(), - ); - } -} - class ChatScreen extends StatefulWidget { @override State createState() => _ChatScreenState(); diff --git a/lib/inbox_page.dart b/lib/inbox_page.dart index 716b266..ead98eb 100755 --- a/lib/inbox_page.dart +++ b/lib/inbox_page.dart @@ -1,25 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_animate/flutter_animate.dart'; -void main() { - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Inbox', - theme: ThemeData( - primarySwatch: Colors.green, - ), - home: const InboxPage(), - ); - } -} - class InboxPage extends StatefulWidget { @override State createState() => _InboxPageState(); @@ -50,9 +31,9 @@ class _InboxPageState extends State { Expanded( child: TabBarView( children: [ - Center(child: const Text('Content A', style: TextStyle(fontSize: 24)).animate().fade().scale().tint(color: Colors.pink)), - Center(child: const Text('Content B', style: TextStyle(fontSize: 24)).animate().fade().scale().tint(color: Colors.cyanAccent)), - Center(child: const Text('Content C', style: TextStyle(fontSize: 24)).animate().fade().scale().tint(color: Colors.greenAccent)), + Center(child: const Text('Regeln:\n1. \n2. \n', style: TextStyle(fontSize: 24)).animate().fade().scale().tint(color: Colors.pink)), + Center(child: const Text('zK-Altersverifikation', style: TextStyle(fontSize: 24)).animate().fade().scale().tint(color: Colors.cyanAccent)), + Center(child: const Text('Karma-Store', style: TextStyle(fontSize: 24)).animate().fade().scale().tint(color: Colors.greenAccent)), ], ), ), diff --git a/lib/main.dart b/lib/main.dart index 0e76108..f078cb2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'note_page.dart'; import 'chat_page.dart'; import 'inbox_page.dart'; import 'settings_page.dart'; - -import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'providers/theme_provider.dart'; void main() { runApp( @@ -15,65 +15,108 @@ void main() { ); } -class MyApp extends StatefulWidget { +class MyApp extends ConsumerWidget { const MyApp({super.key}); @override - State createState() => _MyAppState(); -} + Widget build(BuildContext context, WidgetRef ref) { + final isDarkMode = ref.watch(darkModeProvider); -class _MyAppState extends State { - int _selectedIndex = 0; - static final List _widgetOptions = [ - const NotePage(), - const ChatScreen(), - const InboxPage(), - const SettingsPage(), - ]; + // Modern color palette definition + const accentColor = Color(0xFF2ECC71); // Clean vibrant green - void _onItemTapped(int index) { - setState(() { - _selectedIndex = index; - }); - } + final lightTheme = ThemeData( + useMaterial3: true, + brightness: Brightness.light, + colorScheme: ColorScheme.fromSeed( + seedColor: accentColor, + brightness: Brightness.light, + primary: accentColor, + ), + appBarTheme: const AppBarTheme( + backgroundColor: Colors.transparent, + elevation: 0, + scrolledUnderElevation: 0, + centerTitle: true, + ), + ); + + final darkTheme = ThemeData( + useMaterial3: true, + brightness: Brightness.dark, + colorScheme: ColorScheme.fromSeed( + seedColor: accentColor, + brightness: Brightness.dark, + primary: accentColor, + ), + appBarTheme: const AppBarTheme( + backgroundColor: Colors.transparent, + elevation: 0, + scrolledUnderElevation: 0, + centerTitle: true, + ), + ); - @override - Widget build(BuildContext context) { return MaterialApp( title: 'NotesApp2', - theme: ThemeData.light(), - home: Scaffold( - body: Center( - child: _widgetOptions.elementAt(_selectedIndex), - ), - bottomNavigationBar: BottomNavigationBar( - items: const [ - BottomNavigationBarItem( - icon: FaIcon(FontAwesomeIcons.house), - label: 'Home', - ), - BottomNavigationBarItem( - icon: FaIcon(FontAwesomeIcons.solidMessage), - label: 'Chats', - ), - BottomNavigationBarItem( - icon: FaIcon(FontAwesomeIcons.solidBell), - label: 'Inbox', - ), - BottomNavigationBarItem( - icon: FaIcon(FontAwesomeIcons.gear), - label: 'Settings', - ), - ], - onTap: _onItemTapped, - currentIndex: _selectedIndex, - selectedItemColor: Colors.green, - unselectedItemColor: Colors.grey, - unselectedFontSize: 9.0, - showUnselectedLabels: true, - ), - ), + theme: lightTheme, + darkTheme: darkTheme, + themeMode: isDarkMode ? ThemeMode.dark : ThemeMode.light, + home: const AppShell(), debugShowCheckedModeBanner: false, ); } } + +class AppShell extends ConsumerWidget { + const AppShell({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final selectedIndex = ref.watch(navigationProvider); + final isDarkMode = ref.watch(darkModeProvider); + + final List pages = [ + const NotePage(), + const ChatScreen(), + const InboxPage(), + const SettingsPage(), + ]; + + return Scaffold( + body: IndexedStack( + index: selectedIndex, + children: pages, + ), + bottomNavigationBar: BottomNavigationBar( + type: BottomNavigationBarType.fixed, + items: const [ + BottomNavigationBarItem( + icon: FaIcon(FontAwesomeIcons.house), + label: 'Home', + ), + BottomNavigationBarItem( + icon: FaIcon(FontAwesomeIcons.solidMessage), + label: 'Chats', + ), + BottomNavigationBarItem( + icon: FaIcon(FontAwesomeIcons.solidBell), + label: 'Inbox', + ), + BottomNavigationBarItem( + icon: FaIcon(FontAwesomeIcons.gear), + label: 'Settings', + ), + ], + currentIndex: selectedIndex, + onTap: (index) { + ref.read(navigationProvider.notifier).setTab(index); + }, + selectedItemColor: Theme.of(context).colorScheme.primary, + unselectedItemColor: isDarkMode ? Colors.grey.shade600 : Colors.grey.shade400, + unselectedFontSize: 9.0, + showUnselectedLabels: true, + ), + ); + } +} diff --git a/lib/note_page.dart b/lib/note_page.dart index 184cdea..f35d855 100755 --- a/lib/note_page.dart +++ b/lib/note_page.dart @@ -132,7 +132,7 @@ class _NotePageState extends ConsumerState { return Scaffold( appBar: AppBar( - title: const Text('Jodel 2.0'), + title: const Text('Jodel 2'), centerTitle: true, ), body: notesAsyncValue.when( @@ -153,12 +153,12 @@ class _NotePageState extends ConsumerState { title: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ - Text("@${note.channel}", style: const TextStyle(fontSize: 15, color: Colors.black)), - const SizedBox(width: 10), - Text(DateFormat('kk:mm:ss').format(note.timestamp), style: const TextStyle(fontSize: 13, color: Colors.black)), + Text("@${note.channel}", style: const TextStyle(fontSize: 14, color: Colors.black)), + const SizedBox(width: 50), + Text(DateFormat('dd-MM-yy kk:mm:ss').format(note.timestamp), style: const TextStyle(fontSize: 13, color: Colors.black)), ], ), - subtitle: Text(note.content, style: const TextStyle(fontSize: 20, color: Colors.white)), + subtitle: Text(note.content, style: const TextStyle(fontSize: 28, color: Colors.white)), trailing: Row( mainAxisSize: MainAxisSize.min, children: [ @@ -167,7 +167,7 @@ class _NotePageState extends ConsumerState { onPressed: () => incrementKarma(note.id), color: Colors.black, ), - Text('${note.karma}', style: const TextStyle(fontSize: 12, color: Colors.black)), + Text('${note.karma}', style: const TextStyle(fontSize: 21, color: Colors.white)), IconButton( icon: const FaIcon(FontAwesomeIcons.angleDown), onPressed: () => decrementKarma(note.id), @@ -176,7 +176,7 @@ class _NotePageState extends ConsumerState { IconButton( icon: const Icon(Icons.delete), onPressed: () => _removeNote(note.id), - color: Colors.red, + color: Colors.black, ), ], ), diff --git a/lib/providers/theme_provider.dart b/lib/providers/theme_provider.dart new file mode 100644 index 0000000..fe54897 --- /dev/null +++ b/lib/providers/theme_provider.dart @@ -0,0 +1,27 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +/// Notifier to manage the active bottom navigation tab. +class NavigationNotifier extends Notifier { + @override + int build() => 0; + + void setTab(int index) { + state = index; + } +} + +/// Provider to track the active bottom navigation tab. +final navigationProvider = NotifierProvider(NavigationNotifier.new); + +/// Notifier to manage the Dark Mode state. +class DarkModeNotifier extends Notifier { + @override + bool build() => false; + + void toggle(bool isDark) { + state = isDark; + } +} + +/// Provider to track whether dark mode is currently active. +final darkModeProvider = NotifierProvider(DarkModeNotifier.new); diff --git a/lib/settings_page.dart b/lib/settings_page.dart index 04ac195..0f415b3 100755 --- a/lib/settings_page.dart +++ b/lib/settings_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'providers/note_provider.dart'; +import 'providers/theme_provider.dart'; class SettingsPage extends ConsumerStatefulWidget { const SettingsPage({super.key}); @@ -11,12 +12,12 @@ class SettingsPage extends ConsumerStatefulWidget { } class _SettingsPageState extends ConsumerState { - bool _darkMode = false; bool _notificationsEnabled = true; @override Widget build(BuildContext context) { final useCardano = ref.watch(useCardanoBackendProvider); + final isDarkMode = ref.watch(darkModeProvider); return Scaffold( appBar: AppBar( @@ -35,12 +36,10 @@ class _SettingsPageState extends ConsumerState { ListTile( title: const Text('Dark Mode'), trailing: Switch( - value: _darkMode, + value: isDarkMode, activeThumbColor: Colors.green, onChanged: (value) { - setState(() { - _darkMode = value; - }); + ref.read(darkModeProvider.notifier).toggle(value); }, ), ), diff --git a/pubspec.lock b/pubspec.lock index 1ccd8c7..d402dd9 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: faf38497bda5ead2a8c7615f4f7939df04333478bf32e4173fcb06d428b5716b url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.4.1" cli_config: dependency: transitive description: @@ -235,14 +235,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.5" - js: - dependency: transitive - description: - name: js - sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" - url: "https://pub.dev" - source: hosted - version: "0.7.2" leak_tracker: dependency: transitive description: @@ -287,18 +279,18 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861 url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.19" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + sha256: "9c337007e82b1889149c82ed242ed1cb24a66044e30979c44912381e9be4c48b" url: "https://pub.dev" source: hosted - version: "0.11.1" + version: "0.13.0" meta: dependency: transitive description: @@ -468,26 +460,26 @@ packages: dependency: transitive description: name: test - sha256: "75906bf273541b676716d1ca7627a17e4c4070a3a16272b7a3dc7da3b9f3f6b7" + sha256: "280d6d890011ca966ad08df7e8a4ddfab0fb3aa49f96ed6de56e3521347a9ae7" url: "https://pub.dev" source: hosted - version: "1.26.3" + version: "1.30.0" test_api: dependency: transitive description: name: test_api - sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 + sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a" url: "https://pub.dev" source: hosted - version: "0.7.7" + version: "0.7.10" test_core: dependency: transitive description: name: test_core - sha256: "0cc24b5ff94b38d2ae73e1eb43cc302b77964fbf67abad1e296025b78deb53d0" + sha256: "0381bd1585d1a924763c308100f2138205252fb90c9d4eeaf28489ee65ccde51" url: "https://pub.dev" source: hosted - version: "0.6.12" + version: "0.6.16" typed_data: dependency: transitive description: