diff --git a/packages/clean_framework/CHANGELOG.md b/packages/clean_framework/CHANGELOG.md index 853972b3..ba1eb5c0 100644 --- a/packages/clean_framework/CHANGELOG.md +++ b/packages/clean_framework/CHANGELOG.md @@ -1,4 +1,10 @@ # Changelog +## 4.1.4 +**Sep 1, 2026** +- Bumps dependencies to latest version. +- Adopts Dart primary constructors for applicable classes. +- Switches from `package:flutter/material.dart` to `package:material_ui/material_ui.dart`. + ## 4.1.3 **Jan 12, 2026** - Bump dependency to latest version. diff --git a/packages/clean_framework/example/lib/app/poke_app.dart b/packages/clean_framework/example/lib/app/poke_app.dart index 6633e33b..41f43131 100644 --- a/packages/clean_framework/example/lib/app/poke_app.dart +++ b/packages/clean_framework/example/lib/app/poke_app.dart @@ -3,7 +3,7 @@ import 'package:clean_framework_example_rest/providers.dart'; import 'package:clean_framework_example_rest/routing.dart'; import 'package:clean_framework_example_rest/widgets/app_scope.dart'; import 'package:clean_framework_router/clean_framework_router.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class PokeApp extends StatelessWidget { const PokeApp({super.key}); diff --git a/packages/clean_framework/example/lib/core/pokemon/pokemon_external_interface.dart b/packages/clean_framework/example/lib/core/pokemon/pokemon_external_interface.dart index 039b9693..1c4eae48 100644 --- a/packages/clean_framework/example/lib/core/pokemon/pokemon_external_interface.dart +++ b/packages/clean_framework/example/lib/core/pokemon/pokemon_external_interface.dart @@ -33,6 +33,7 @@ class PokemonExternalInterface case DioExceptionType.receiveTimeout: case DioExceptionType.sendTimeout: case DioExceptionType.cancel: + case DioExceptionType.transformTimeout: return const PokemonFailureResponse( type: PokemonFailureType.serverError, ); @@ -42,20 +43,20 @@ class PokemonExternalInterface final data = Map.from(response.data as Map); return switch (response.statusCode) { 401 => PokemonFailureResponse( - type: PokemonFailureType.unauthorized, - message: 'The request was not authorized.', - errorData: data, - ), + type: PokemonFailureType.unauthorized, + message: 'The request was not authorized.', + errorData: data, + ), 404 => PokemonFailureResponse( - type: PokemonFailureType.notFound, - message: 'The requested resource was not found.', - errorData: data, - ), + type: PokemonFailureType.notFound, + message: 'The requested resource was not found.', + errorData: data, + ), _ => PokemonFailureResponse( - type: PokemonFailureType.unknown, - message: 'An unknown error occurred.', - errorData: data, - ), + type: PokemonFailureType.unknown, + message: 'An unknown error occurred.', + errorData: data, + ), }; case DioExceptionType.badCertificate: case DioExceptionType.connectionError: diff --git a/packages/clean_framework/example/lib/features/form/presentation/form_presenter.dart b/packages/clean_framework/example/lib/features/form/presentation/form_presenter.dart index 1491bde6..0671dfb1 100644 --- a/packages/clean_framework/example/lib/features/form/presentation/form_presenter.dart +++ b/packages/clean_framework/example/lib/features/form/presentation/form_presenter.dart @@ -5,7 +5,7 @@ import 'package:clean_framework_example_rest/features/form/domain/form_domain_mo import 'package:clean_framework_example_rest/features/form/domain/form_use_case.dart'; import 'package:clean_framework_example_rest/features/form/presentation/form_view_model.dart'; import 'package:clean_framework_example_rest/providers.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class FormPresenter extends Presenter { diff --git a/packages/clean_framework/example/lib/features/form/presentation/form_ui.dart b/packages/clean_framework/example/lib/features/form/presentation/form_ui.dart index 4f6c8486..fe39e904 100644 --- a/packages/clean_framework/example/lib/features/form/presentation/form_ui.dart +++ b/packages/clean_framework/example/lib/features/form/presentation/form_ui.dart @@ -3,7 +3,7 @@ import 'package:clean_framework_example_rest/features/form/domain/form_entity.da import 'package:clean_framework_example_rest/features/form/presentation/form_presenter.dart'; import 'package:clean_framework_example_rest/features/form/presentation/form_view_model.dart'; import 'package:clean_framework_example_rest/widgets/fields.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class FormUI extends UI { FormUI({super.key}); diff --git a/packages/clean_framework/example/lib/features/home/presentation/home_presenter.dart b/packages/clean_framework/example/lib/features/home/presentation/home_presenter.dart index e7c12300..eb0aa81e 100644 --- a/packages/clean_framework/example/lib/features/home/presentation/home_presenter.dart +++ b/packages/clean_framework/example/lib/features/home/presentation/home_presenter.dart @@ -6,7 +6,7 @@ import 'package:clean_framework_example_rest/features/home/domain/home_entity.da import 'package:clean_framework_example_rest/features/home/domain/home_use_case.dart'; import 'package:clean_framework_example_rest/features/home/presentation/home_view_model.dart'; import 'package:clean_framework_example_rest/providers.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class HomePresenter extends Presenter { diff --git a/packages/clean_framework/example/lib/features/home/presentation/home_ui.dart b/packages/clean_framework/example/lib/features/home/presentation/home_ui.dart index 09558a00..feba3b70 100644 --- a/packages/clean_framework/example/lib/features/home/presentation/home_ui.dart +++ b/packages/clean_framework/example/lib/features/home/presentation/home_ui.dart @@ -8,7 +8,7 @@ import 'package:clean_framework_example_rest/routing/routes.dart'; import 'package:clean_framework_example_rest/widgets/pokemon_card.dart'; import 'package:clean_framework_example_rest/widgets/pokemon_search_field.dart'; import 'package:clean_framework_router/clean_framework_router.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class HomeUI extends UI { HomeUI({super.key}); diff --git a/packages/clean_framework/example/lib/features/profile/presentation/profile_presenter.dart b/packages/clean_framework/example/lib/features/profile/presentation/profile_presenter.dart index 48347ac6..c350be53 100644 --- a/packages/clean_framework/example/lib/features/profile/presentation/profile_presenter.dart +++ b/packages/clean_framework/example/lib/features/profile/presentation/profile_presenter.dart @@ -5,10 +5,11 @@ import 'package:clean_framework_example_rest/features/profile/domain/profile_dom import 'package:clean_framework_example_rest/features/profile/domain/profile_use_case.dart'; import 'package:clean_framework_example_rest/features/profile/presentation/profile_view_model.dart'; import 'package:clean_framework_example_rest/providers.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; -class ProfilePresenter extends Presenter { +class ProfilePresenter + extends + Presenter { ProfilePresenter({ required super.builder, required String name, @@ -27,8 +28,9 @@ class ProfilePresenter extends Presenter { ProfileUI({ @@ -227,8 +227,8 @@ class _PokeTypeChip extends StatelessWidget { Text( type.name, style: Theme.of(context).textTheme.bodyMedium!.copyWith( - color: type.color, - ), + color: type.color, + ), ), ], ), diff --git a/packages/clean_framework/example/lib/features/profile/presentation/profile_view_model.dart b/packages/clean_framework/example/lib/features/profile/presentation/profile_view_model.dart index 96c46a52..268c14b7 100644 --- a/packages/clean_framework/example/lib/features/profile/presentation/profile_view_model.dart +++ b/packages/clean_framework/example/lib/features/profile/presentation/profile_view_model.dart @@ -1,6 +1,6 @@ import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework_example_rest/features/profile/domain/profile_domain_models.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class ProfileViewModel extends ViewModel { const ProfileViewModel({ @@ -23,8 +23,8 @@ class ProfileViewModel extends ViewModel { class PokemonType { PokemonType(this.name) - : color = _pokemonTypeColors[name] ?? Colors.white, - emoji = _pokemonTypeEmojis[name] ?? ''; + : color = _pokemonTypeColors[name] ?? Colors.white, + emoji = _pokemonTypeEmojis[name] ?? ''; final String name; final String emoji; diff --git a/packages/clean_framework/example/lib/main.dart b/packages/clean_framework/example/lib/main.dart index 55b2d31f..31d31167 100644 --- a/packages/clean_framework/example/lib/main.dart +++ b/packages/clean_framework/example/lib/main.dart @@ -1,5 +1,5 @@ import 'package:clean_framework_example_rest/app/poke_app.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; void main() { runApp(const PokeApp()); diff --git a/packages/clean_framework/example/lib/widgets/fields/checkbox_input_field.dart b/packages/clean_framework/example/lib/widgets/fields/checkbox_input_field.dart index 096a076b..700d176e 100644 --- a/packages/clean_framework/example/lib/widgets/fields/checkbox_input_field.dart +++ b/packages/clean_framework/example/lib/widgets/fields/checkbox_input_field.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:uniform/uniform.dart'; class CheckboxInputField extends StatelessWidget { diff --git a/packages/clean_framework/example/lib/widgets/fields/dropdown_input_field.dart b/packages/clean_framework/example/lib/widgets/fields/dropdown_input_field.dart index 9ca79f90..ffebde0f 100644 --- a/packages/clean_framework/example/lib/widgets/fields/dropdown_input_field.dart +++ b/packages/clean_framework/example/lib/widgets/fields/dropdown_input_field.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:uniform/uniform.dart'; class DropdownInputField extends StatelessWidget { diff --git a/packages/clean_framework/example/lib/widgets/fields/form_button.dart b/packages/clean_framework/example/lib/widgets/fields/form_button.dart index 714d3eb2..a44b863a 100644 --- a/packages/clean_framework/example/lib/widgets/fields/form_button.dart +++ b/packages/clean_framework/example/lib/widgets/fields/form_button.dart @@ -1,5 +1,5 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class FormButton extends StatelessWidget { const FormButton({required this.onPressed, required this.child, super.key}); @@ -11,7 +11,8 @@ class FormButton extends StatelessWidget { Widget build(BuildContext context) { return UniformBuilder( builder: (context, controller, _) { - final isEnabled = controller.contains({InputFormState.touched}) && + final isEnabled = + controller.contains({InputFormState.touched}) && !controller.isSubmitted; return FilledButton( diff --git a/packages/clean_framework/example/lib/widgets/fields/text_input_field.dart b/packages/clean_framework/example/lib/widgets/fields/text_input_field.dart index eb8b923b..2823d418 100644 --- a/packages/clean_framework/example/lib/widgets/fields/text_input_field.dart +++ b/packages/clean_framework/example/lib/widgets/fields/text_input_field.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:uniform/uniform.dart'; class TextInputField extends StatelessWidget { diff --git a/packages/clean_framework/example/lib/widgets/pokemon_card.dart b/packages/clean_framework/example/lib/widgets/pokemon_card.dart index c83bdcd4..cbc955c4 100644 --- a/packages/clean_framework/example/lib/widgets/pokemon_card.dart +++ b/packages/clean_framework/example/lib/widgets/pokemon_card.dart @@ -1,5 +1,5 @@ import 'package:clean_framework_example_rest/widgets/svg_palette_card.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class PokemonCard extends StatelessWidget { const PokemonCard({ @@ -33,9 +33,7 @@ class PokemonCard extends StatelessWidget { alignment: Alignment.topLeft, child: Text( name, - style: Theme.of(context) - .textTheme - .titleMedium! + style: Theme.of(context).textTheme.titleMedium! .copyWith(fontWeight: FontWeight.w300), ), ), diff --git a/packages/clean_framework/example/lib/widgets/pokemon_search_field.dart b/packages/clean_framework/example/lib/widgets/pokemon_search_field.dart index f4aec634..dc1b6208 100644 --- a/packages/clean_framework/example/lib/widgets/pokemon_search_field.dart +++ b/packages/clean_framework/example/lib/widgets/pokemon_search_field.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class PokemonSearchField extends StatelessWidget implements PreferredSizeWidget { diff --git a/packages/clean_framework/example/lib/widgets/spotlight.dart b/packages/clean_framework/example/lib/widgets/spotlight.dart index acba6bb2..7931c9b7 100644 --- a/packages/clean_framework/example/lib/widgets/spotlight.dart +++ b/packages/clean_framework/example/lib/widgets/spotlight.dart @@ -2,9 +2,9 @@ import 'dart:async'; import 'dart:math'; import 'package:clean_framework_example_rest/widgets/app_scope.dart'; -import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:palette_generator/palette_generator.dart'; class Spotlight extends StatefulWidget { diff --git a/packages/clean_framework/example/lib/widgets/svg_palette_card.dart b/packages/clean_framework/example/lib/widgets/svg_palette_card.dart index 0129c61f..4e82ae13 100644 --- a/packages/clean_framework/example/lib/widgets/svg_palette_card.dart +++ b/packages/clean_framework/example/lib/widgets/svg_palette_card.dart @@ -2,10 +2,10 @@ import 'dart:async'; import 'dart:developer'; import 'package:clean_framework_example_rest/widgets/app_scope.dart'; -import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:palette_generator/palette_generator.dart'; class SvgPaletteCard extends StatefulWidget { @@ -116,7 +116,8 @@ class _SvgPaletteCardState extends State { final palette = await AppScope.paletteGeneratorOf(context, image); if (!mounted) return; - _color = widget.backgroundColorBuilder?.call(context, palette) ?? + _color = + widget.backgroundColorBuilder?.call(context, palette) ?? palette.dominantColor?.color; setState(() {}); diff --git a/packages/clean_framework/example/linux/flutter/generated_plugins.cmake b/packages/clean_framework/example/linux/flutter/generated_plugins.cmake index 2e1de87a..be1ee3e5 100644 --- a/packages/clean_framework/example/linux/flutter/generated_plugins.cmake +++ b/packages/clean_framework/example/linux/flutter/generated_plugins.cmake @@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/packages/clean_framework/example/pubspec.yaml b/packages/clean_framework/example/pubspec.yaml index 8bf3511c..3d9b57ce 100644 --- a/packages/clean_framework/example/pubspec.yaml +++ b/packages/clean_framework/example/pubspec.yaml @@ -4,7 +4,7 @@ publish_to: none version: 2.0.3+3 environment: - sdk: '>=3.8.0 <4.0.0' + sdk: ">=3.13.0 <4.0.0" resolution: workspace @@ -17,6 +17,7 @@ dependencies: sdk: flutter flutter_cache_manager: ^3.4.1 flutter_svg: ^2.0.10+1 + material_ui: ^1.1.0 palette_generator: ^0.3.3+4 uniform: ^2.0.6 diff --git a/packages/clean_framework/example/test/features/home/presentation/home_ui_test.dart b/packages/clean_framework/example/test/features/home/presentation/home_ui_test.dart index 45ebcd07..c86125db 100644 --- a/packages/clean_framework/example/test/features/home/presentation/home_ui_test.dart +++ b/packages/clean_framework/example/test/features/home/presentation/home_ui_test.dart @@ -6,8 +6,8 @@ import 'package:clean_framework_example_rest/widgets/app_scope.dart'; import 'package:clean_framework_example_rest/widgets/pokemon_card.dart'; import 'package:clean_framework_router/clean_framework_router.dart'; import 'package:clean_framework_test/clean_framework_test.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:palette_generator/palette_generator.dart'; import '../../../helpers/test_cache_manager.dart'; diff --git a/packages/clean_framework/example/test/features/profile/presentation/profile_ui_test.dart b/packages/clean_framework/example/test/features/profile/presentation/profile_ui_test.dart index e622d8f0..5fdb2db7 100644 --- a/packages/clean_framework/example/test/features/profile/presentation/profile_ui_test.dart +++ b/packages/clean_framework/example/test/features/profile/presentation/profile_ui_test.dart @@ -3,8 +3,8 @@ import 'package:clean_framework_example_rest/features/profile/presentation/profi import 'package:clean_framework_example_rest/features/profile/presentation/profile_view_model.dart'; import 'package:clean_framework_example_rest/widgets/app_scope.dart'; import 'package:clean_framework_test/clean_framework_test.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:palette_generator/palette_generator.dart'; import '../../../helpers/test_cache_manager.dart'; diff --git a/packages/clean_framework/example/test/flow_test.dart b/packages/clean_framework/example/test/flow_test.dart index 906e0c6a..f4ef06d4 100644 --- a/packages/clean_framework/example/test/flow_test.dart +++ b/packages/clean_framework/example/test/flow_test.dart @@ -12,8 +12,8 @@ import 'package:clean_framework_example_rest/providers.dart'; import 'package:clean_framework_example_rest/routing.dart'; import 'package:clean_framework_example_rest/widgets/app_scope.dart'; import 'package:clean_framework_router/clean_framework_router.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; void main() { testWidgets('Flow Test', (tester) async { @@ -75,8 +75,7 @@ class PokemonExternalInterfaceFake extends PokemonExternalInterface { data: { 'flavor_text_entries': [ { - 'flavor_text': - 'It keeps its tail\nraised to monitor\nits surroundings.\fIf you yank its\ntail, it will try\nto bite you.', + 'flavor_text': 'It keeps its tail\nraised to monitor\nits surroundings.\fIf you yank its\ntail, it will try\nto bite you.', 'language': { 'name': 'en', 'url': 'https://pokeapi.co/api/v2/language/9/', @@ -87,8 +86,7 @@ class PokemonExternalInterfaceFake extends PokemonExternalInterface { }, }, { - 'flavor_text': - 'This intelligent\nPOKéMON roasts\nhard BERRIES with\felectricity to\nmake them tender\nenough to eat.', + 'flavor_text': 'This intelligent\nPOKéMON roasts\nhard BERRIES with\felectricity to\nmake them tender\nenough to eat.', 'language': { 'name': 'en', 'url': 'https://pokeapi.co/api/v2/language/9/', diff --git a/packages/clean_framework/example/test/widgets/app_scope_test.dart b/packages/clean_framework/example/test/widgets/app_scope_test.dart index ab5aeede..cf3de29b 100644 --- a/packages/clean_framework/example/test/widgets/app_scope_test.dart +++ b/packages/clean_framework/example/test/widgets/app_scope_test.dart @@ -2,9 +2,9 @@ import 'dart:async'; import 'package:clean_framework_example_rest/widgets/app_scope.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:palette_generator/palette_generator.dart'; import '../helpers/test_cache_manager.dart'; diff --git a/packages/clean_framework/example/test/widgets/pokemon_card_test.dart b/packages/clean_framework/example/test/widgets/pokemon_card_test.dart index 33c1ce4f..6d11fc95 100644 --- a/packages/clean_framework/example/test/widgets/pokemon_card_test.dart +++ b/packages/clean_framework/example/test/widgets/pokemon_card_test.dart @@ -1,7 +1,7 @@ import 'package:clean_framework_example_rest/widgets/app_scope.dart'; import 'package:clean_framework_example_rest/widgets/pokemon_card.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:palette_generator/palette_generator.dart'; import '../helpers/test_cache_manager.dart'; diff --git a/packages/clean_framework/example/test/widgets/svg_palette_card_test.dart b/packages/clean_framework/example/test/widgets/svg_palette_card_test.dart index 6b721c3a..b2af52d1 100644 --- a/packages/clean_framework/example/test/widgets/svg_palette_card_test.dart +++ b/packages/clean_framework/example/test/widgets/svg_palette_card_test.dart @@ -1,7 +1,7 @@ import 'package:clean_framework_example_rest/widgets/app_scope.dart'; import 'package:clean_framework_example_rest/widgets/svg_palette_card.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:palette_generator/palette_generator.dart'; import '../helpers/test_cache_manager.dart'; diff --git a/packages/clean_framework/example/windows/flutter/generated_plugins.cmake b/packages/clean_framework/example/windows/flutter/generated_plugins.cmake index b93c4c30..3ad69c61 100644 --- a/packages/clean_framework/example/windows/flutter/generated_plugins.cmake +++ b/packages/clean_framework/example/windows/flutter/generated_plugins.cmake @@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/packages/clean_framework/lib/src/app_providers_container.dart b/packages/clean_framework/lib/src/app_providers_container.dart index 7a868a37..9e9f7630 100644 --- a/packages/clean_framework/lib/src/app_providers_container.dart +++ b/packages/clean_framework/lib/src/app_providers_container.dart @@ -14,9 +14,8 @@ class AppProvidersContainer extends StatelessWidget { required this.child, super.key, ProvidersContext? providersContext, - ContainerBuildCallback? onBuild, - }) : _providersContext = providersContext ?? ProvidersContext(), - _onBuild = onBuild; + this._onBuild, + }) : _providersContext = providersContext ?? ProvidersContext(); /// The widget below this widget in the tree. final Widget child; diff --git a/packages/clean_framework/lib/src/core/app_provider_scope.dart b/packages/clean_framework/lib/src/core/app_provider_scope.dart index ab5b2f50..017ea0e2 100644 --- a/packages/clean_framework/lib/src/core/app_provider_scope.dart +++ b/packages/clean_framework/lib/src/core/app_provider_scope.dart @@ -1,7 +1,7 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/misc.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:stack_trace/stack_trace.dart'; class AppProviderScope extends StatelessWidget { @@ -70,7 +70,7 @@ class _ProviderInitializerState extends State<_ProviderInitializer> { void initState() { super.initState(); - FlutterError.demangleStackTrace = (StackTrace stack) { + FlutterError.demangleStackTrace = (stack) { if (stack is Trace) return stack.vmTrace; if (stack is Chain) return stack.toTrace().vmTrace; return stack; diff --git a/packages/clean_framework/lib/src/core/clean_framework_provider.dart b/packages/clean_framework/lib/src/core/clean_framework_provider.dart index 0e9fc920..87e9fbeb 100644 --- a/packages/clean_framework/lib/src/core/clean_framework_provider.dart +++ b/packages/clean_framework/lib/src/core/clean_framework_provider.dart @@ -1,7 +1,7 @@ import 'package:flutter_riverpod/misc.dart'; abstract class CleanFrameworkProvider

> { - CleanFrameworkProvider({required P provider}) : _provider = provider; + CleanFrameworkProvider({required this._provider}); final P _provider; diff --git a/packages/clean_framework/lib/src/core/dependency/dependency_provider.dart b/packages/clean_framework/lib/src/core/dependency/dependency_provider.dart index bc786cde..4529ab8f 100644 --- a/packages/clean_framework/lib/src/core/dependency/dependency_provider.dart +++ b/packages/clean_framework/lib/src/core/dependency/dependency_provider.dart @@ -16,11 +16,7 @@ class DependencyProvider T read(ProviderContainer container) => container.read(call()); } -class DependencyRef { - const DependencyRef(this._ref); - - final Ref _ref; - +class const DependencyRef(final Ref _ref) { T read(DependencyProvider provider) { return _ref.read(provider()); } diff --git a/packages/clean_framework/lib/src/core/external_interface/response.dart b/packages/clean_framework/lib/src/core/external_interface/response.dart index c6c45657..aef3a25a 100644 --- a/packages/clean_framework/lib/src/core/external_interface/response.dart +++ b/packages/clean_framework/lib/src/core/external_interface/response.dart @@ -16,25 +16,17 @@ class SuccessResponse extends Response { List get props => []; } -abstract class FailureResponse extends Response { - const FailureResponse({this.message = ''}); - - final String message; - +abstract class const FailureResponse({final String message = ''}) + extends Response { @override List get props => [message]; } -class TypedFailureResponse extends FailureResponse { - const TypedFailureResponse({ - required this.type, - this.errorData = const {}, - super.message, - }); - - final T type; - final Map errorData; - +class const TypedFailureResponse({ + required final T type, + final Map errorData = const {}, + super.message, +}) extends FailureResponse { @override List get props => [...super.props, type, errorData]; } diff --git a/packages/clean_framework/lib/src/core/use_case/helpers/domain_input.dart b/packages/clean_framework/lib/src/core/use_case/helpers/domain_input.dart index 424a9039..eb83c632 100644 --- a/packages/clean_framework/lib/src/core/use_case/helpers/domain_input.dart +++ b/packages/clean_framework/lib/src/core/use_case/helpers/domain_input.dart @@ -6,9 +6,6 @@ import 'package:meta/meta.dart'; @immutable abstract class DomainInput extends DomainDTO {} -@Deprecated('Use DomainInput.') -abstract class Input extends DomainInput {} - /// Used for the transfer of data into the domain layer (use case) after some /// success response. class SuccessDomainInput implements DomainInput { @@ -29,20 +26,11 @@ class SuccessInput extends SuccessDomainInput { /// Used for the transfer of data into the domain layer (use case) after some /// failure response. -class FailureDomainInput implements DomainInput { - const FailureDomainInput({this.message = ''}); - - final String message; - +class const FailureDomainInput({final String message = ''}) + implements DomainInput { @override List get props => [message]; @override bool? get stringify => true; } - -@Deprecated('Use FailureDomainInput.') -class FailureInput extends FailureDomainInput { - @Deprecated('Use FailureDomainInput.') - const FailureInput({super.message = ''}); -} diff --git a/packages/clean_framework/lib/src/defaults/feature_provider/json_feature_provider.dart b/packages/clean_framework/lib/src/defaults/feature_provider/json_feature_provider.dart index 7a8c47c0..1f83b62f 100644 --- a/packages/clean_framework/lib/src/defaults/feature_provider/json_feature_provider.dart +++ b/packages/clean_framework/lib/src/defaults/feature_provider/json_feature_provider.dart @@ -12,8 +12,8 @@ export 'engine/open_feature_flags.dart'; class JsonFeatureProvider implements FeatureProvider { /// Default constructor. JsonFeatureProvider({ - EvaluationEngine engine = const JsonEvaluationEngine(), - }) : _engine = engine; + this._engine = const JsonEvaluationEngine(), + }); final EvaluationEngine _engine; final Completer _flagsCompleter = Completer(); diff --git a/packages/clean_framework/lib/src/open_feature/src/core/resolution_details.dart b/packages/clean_framework/lib/src/open_feature/src/core/resolution_details.dart index 7bca9408..a5d8d52a 100644 --- a/packages/clean_framework/lib/src/open_feature/src/core/resolution_details.dart +++ b/packages/clean_framework/lib/src/open_feature/src/core/resolution_details.dart @@ -1,15 +1,8 @@ import 'package:clean_framework/src/open_feature/src/core/enums.dart'; -class ResolutionDetails { - ResolutionDetails({ - required this.value, - this.errorCode, - this.reason, - this.variant, - }); - - final T value; - final ErrorCode? errorCode; - final Reason? reason; - final String? variant; -} +class ResolutionDetails({ + required final T value, + final ErrorCode? errorCode, + final Reason? reason, + final String? variant, +}); diff --git a/packages/clean_framework/lib/src/open_feature/src/exceptions/open_feature_exception.dart b/packages/clean_framework/lib/src/open_feature/src/exceptions/open_feature_exception.dart index 4bddae7b..d43a9b4e 100644 --- a/packages/clean_framework/lib/src/open_feature/src/exceptions/open_feature_exception.dart +++ b/packages/clean_framework/lib/src/open_feature/src/exceptions/open_feature_exception.dart @@ -7,9 +7,7 @@ export 'src/flag_not_found_exception.dart'; export 'src/parse_exception.dart'; export 'src/type_mismatch_exception.dart'; -abstract class OpenFeatureException implements Exception { - OpenFeatureException(this.message, {required this.code}); - - final String message; - final ErrorCode code; -} +abstract class OpenFeatureException( + final String message, { + required final ErrorCode code, +}) implements Exception; diff --git a/packages/clean_framework/lib/src/open_feature/src/flag_evaluation/flag_evaluation_details.dart b/packages/clean_framework/lib/src/open_feature/src/flag_evaluation/flag_evaluation_details.dart index d737e08d..9ed4c348 100644 --- a/packages/clean_framework/lib/src/open_feature/src/flag_evaluation/flag_evaluation_details.dart +++ b/packages/clean_framework/lib/src/open_feature/src/flag_evaluation/flag_evaluation_details.dart @@ -1,17 +1,9 @@ import 'package:clean_framework/src/open_feature/src/core/enums.dart'; -class FlagEvaluationDetails { - FlagEvaluationDetails({ - required this.key, - required this.value, - this.errorCode, - this.reason, - this.variant, - }); - - final String key; - final T value; - final ErrorCode? errorCode; - final Reason? reason; - final String? variant; -} +class FlagEvaluationDetails({ + required final String key, + required final T value, + final ErrorCode? errorCode, + final Reason? reason, + final String? variant, +}); diff --git a/packages/clean_framework/lib/src/open_feature/src/flag_evaluation/flag_evaluation_options.dart b/packages/clean_framework/lib/src/open_feature/src/flag_evaluation/flag_evaluation_options.dart index 414a1c57..c64e5202 100644 --- a/packages/clean_framework/lib/src/open_feature/src/flag_evaluation/flag_evaluation_options.dart +++ b/packages/clean_framework/lib/src/open_feature/src/flag_evaluation/flag_evaluation_options.dart @@ -1,11 +1,6 @@ import 'package:clean_framework/src/open_feature/src/hook/hook.dart'; -class FlagEvaluationOptions { - const FlagEvaluationOptions({ - this.hooks = const [], - this.hookHints, - }); - - final List hooks; - final HookHints? hookHints; -} +class const FlagEvaluationOptions({ + final List hooks = const [], + final HookHints? hookHints, +}); diff --git a/packages/clean_framework/lib/src/open_feature/src/hook/hook_context.dart b/packages/clean_framework/lib/src/open_feature/src/hook/hook_context.dart index d7efb49d..a26aaf7e 100644 --- a/packages/clean_framework/lib/src/open_feature/src/hook/hook_context.dart +++ b/packages/clean_framework/lib/src/open_feature/src/hook/hook_context.dart @@ -5,24 +5,14 @@ import 'package:clean_framework/src/open_feature/src/core/feature_client.dart'; import 'package:clean_framework/src/open_feature/src/evaluation_context/evaluation_context.dart'; import 'package:clean_framework/src/open_feature/src/provider/feature_provider.dart'; -class HookContext { - HookContext({ - required this.flagKey, - required this.flagType, - required this.context, - required this.defaultValue, - required this.client, - required this.provider, - }); - - final String flagKey; - final FlagValueType flagType; - final EvaluationContext context; - final T defaultValue; - - final FeatureClient client; - final FeatureProvider provider; - +class HookContext({ + required final String flagKey, + required final FlagValueType flagType, + required final EvaluationContext context, + required final T defaultValue, + required final FeatureClient client, + required final FeatureProvider provider, +}) { HookContext apply({required EvaluationContext context}) { return HookContext( flagKey: flagKey, diff --git a/packages/clean_framework/lib/src/open_feature/src/hook/hook_hints.dart b/packages/clean_framework/lib/src/open_feature/src/hook/hook_hints.dart index f70f0540..e852aff2 100644 --- a/packages/clean_framework/lib/src/open_feature/src/hook/hook_hints.dart +++ b/packages/clean_framework/lib/src/open_feature/src/hook/hook_hints.dart @@ -2,11 +2,8 @@ import 'dart:collection'; -class HookHints extends UnmodifiableMapBase { - HookHints(this._map); - - final Map _map; - +class HookHints(final Map _map) + extends UnmodifiableMapBase { @override Iterable get keys => _map.keys; diff --git a/packages/clean_framework/lib/src/presentation/presenter/presenter.dart b/packages/clean_framework/lib/src/presentation/presenter/presenter.dart index e3fad074..b966f811 100644 --- a/packages/clean_framework/lib/src/presentation/presenter/presenter.dart +++ b/packages/clean_framework/lib/src/presentation/presenter/presenter.dart @@ -2,8 +2,8 @@ import 'dart:async'; import 'package:clean_framework/src/core/core.dart'; import 'package:clean_framework/src/presentation/presenter/view_model.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:meta/meta.dart'; abstract class Presenter< diff --git a/packages/clean_framework/lib/src/presentation/ui/ui.dart b/packages/clean_framework/lib/src/presentation/ui/ui.dart index 898a828f..073bda33 100644 --- a/packages/clean_framework/lib/src/presentation/ui/ui.dart +++ b/packages/clean_framework/lib/src/presentation/ui/ui.dart @@ -1,5 +1,5 @@ import 'package:clean_framework/src/presentation/presentation.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; abstract class UI extends StatefulWidget { UI({ diff --git a/packages/clean_framework/lib/src/providers/gateway.dart b/packages/clean_framework/lib/src/providers/gateway.dart index a833d5c1..26b5cc61 100644 --- a/packages/clean_framework/lib/src/providers/gateway.dart +++ b/packages/clean_framework/lib/src/providers/gateway.dart @@ -1,18 +1,22 @@ import 'package:clean_framework/clean_framework_legacy.dart'; import 'package:meta/meta.dart'; -abstract class Gateway { +abstract class Gateway< + M extends DomainModel, + R extends Request, + P extends SuccessResponse, + S extends SuccessDomainInput +> { Gateway({ ProvidersContext? context, UseCaseProvider? provider, UseCase? useCase, }) : assert( - () { - return (context != null && provider != null) || useCase != null; - }(), - '', - ) { + () { + return (context != null && provider != null) || useCase != null; + }(), + '', + ) { _useCase = useCase ?? provider!.getUseCaseFromContext(context!); _useCase.subscribe( (domainModel) => _processRequest(buildRequest(domainModel)), @@ -36,13 +40,15 @@ abstract class Gateway { +abstract class BridgeGateway< + SUBSCRIBER_MODEL extends DomainModel, + PUBLISHER_MODEL extends DomainModel, + SUBSCRIBER_INPUT extends DomainInput +> { BridgeGateway({ - required UseCase subscriberUseCase, - required UseCase publisherUseCase, - }) : _subscriberUseCase = subscriberUseCase, - _publisherUseCase = publisherUseCase { + required this._subscriberUseCase, + required this._publisherUseCase, + }) { _subscriberUseCase.subscribe( (output) { return Either.right( @@ -60,10 +66,12 @@ abstract class BridgeGateway extends Gateway { + M extends DomainModel, + R extends Request, + P extends SuccessResponse, + S extends SuccessDomainInput +> + extends Gateway { WatcherGateway({ required ProvidersContext context, required UseCaseProvider provider, @@ -80,5 +88,5 @@ abstract class WatcherGateway< } } -typedef Transport - = Future> Function(R request); +typedef Transport = + Future> Function(R request); diff --git a/packages/clean_framework/lib/src/providers/presenter.dart b/packages/clean_framework/lib/src/providers/presenter.dart index 4006cf69..7eaa9c62 100644 --- a/packages/clean_framework/lib/src/providers/presenter.dart +++ b/packages/clean_framework/lib/src/providers/presenter.dart @@ -2,17 +2,21 @@ import 'package:clean_framework/src/core/use_case/use_case.dart'; import 'package:clean_framework/src/presentation/presenter/presenter.dart'; import 'package:clean_framework/src/presentation/presenter/view_model.dart'; import 'package:clean_framework/src/providers/use_case_provider.dart'; -import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; - -abstract class Presenter extends ConsumerStatefulWidget { +import 'package:material_ui/material_ui.dart'; + +abstract class Presenter< + V extends ViewModel, + M extends DomainModel, + U extends UseCase +> + extends ConsumerStatefulWidget { const Presenter({ - required UseCaseProvider provider, + required this._provider, required this.builder, super.key, - }) : _provider = provider; + }); final UseCaseProvider _provider; final PresenterBuilder builder; @@ -47,8 +51,12 @@ abstract class Presenter _provider.subscribe(ref); } -class _PresenterState extends ConsumerState> { +class _PresenterState< + V extends ViewModel, + M extends DomainModel, + U extends UseCase +> + extends ConsumerState> { U? _useCase; @override diff --git a/packages/clean_framework/lib/src/providers/ui.dart b/packages/clean_framework/lib/src/providers/ui.dart index b046731a..bc663864 100644 --- a/packages/clean_framework/lib/src/providers/ui.dart +++ b/packages/clean_framework/lib/src/providers/ui.dart @@ -1,5 +1,5 @@ import 'package:clean_framework/clean_framework_legacy.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; abstract class UI extends StatefulWidget { UI({ diff --git a/packages/clean_framework/lib/src/utilities/clean_framework_observer.dart b/packages/clean_framework/lib/src/utilities/clean_framework_observer.dart index fb6d9dde..6846cfdc 100644 --- a/packages/clean_framework/lib/src/utilities/clean_framework_observer.dart +++ b/packages/clean_framework/lib/src/utilities/clean_framework_observer.dart @@ -5,18 +5,13 @@ import 'package:clean_framework/src/utilities/logger.dart'; Logger get logger => CleanFrameworkObserver.instance.logger; /// The class to observe failures, route changes and other events. -class CleanFrameworkObserver { - /// Default constructor. - CleanFrameworkObserver({ - this.enableNetworkLogs = true, - this.logger = const Logger(), - }); - - final Logger logger; - +class CleanFrameworkObserver({ /// Enables network logs. - final bool enableNetworkLogs; + final bool enableNetworkLogs = true, + /// Logger used by [CleanFrameworkObserver]. + final Logger logger = const Logger(), +}) { /// Default instance of [CleanFrameworkObserver]. /// /// This can be changed in following way: diff --git a/packages/clean_framework/lib/src/widgets/src/feature_builder.dart b/packages/clean_framework/lib/src/widgets/src/feature_builder.dart index 2f70da2f..1d42a522 100644 --- a/packages/clean_framework/lib/src/widgets/src/feature_builder.dart +++ b/packages/clean_framework/lib/src/widgets/src/feature_builder.dart @@ -1,7 +1,7 @@ import 'dart:developer'; import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; typedef FeatureBuilderCallback = Widget Function( BuildContext, diff --git a/packages/clean_framework/lib/src/widgets/src/feature_scope.dart b/packages/clean_framework/lib/src/widgets/src/feature_scope.dart index 04b358ea..2b3cdf05 100644 --- a/packages/clean_framework/lib/src/widgets/src/feature_scope.dart +++ b/packages/clean_framework/lib/src/widgets/src/feature_scope.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class FeatureScope extends StatefulWidget { const FeatureScope({ @@ -19,8 +19,8 @@ class FeatureScope extends StatefulWidget { // ignore: library_private_types_in_public_api static _InheritedFeatureScope of(BuildContext context) { - final result = - context.dependOnInheritedWidgetOfExactType<_InheritedFeatureScope>(); + final result = context + .dependOnInheritedWidgetOfExactType<_InheritedFeatureScope>(); assert(result != null, 'No _InheritedFeatureScope found in context'); return result!; } diff --git a/packages/clean_framework/pubspec.yaml b/packages/clean_framework/pubspec.yaml index 9e60972a..f82761c6 100644 --- a/packages/clean_framework/pubspec.yaml +++ b/packages/clean_framework/pubspec.yaml @@ -1,6 +1,6 @@ name: clean_framework description: Clean Architecture components library, inspired on the guidelines created by Uncle Bob. -version: 4.1.3 +version: 4.1.4 homepage: https://acmesoftware.com/ repository: https://github.com/AcmeSoftwareLLC/clean_framework screenshots: @@ -13,24 +13,25 @@ topics: - feature-flag environment: - sdk: '>=3.8.0 <4.0.0' - flutter: '>=3.32.0' + sdk: ">=3.13.0 <4.0.0" + flutter: ">=3.47.0" resolution: workspace dependencies: - equatable: ^2.0.8 + equatable: ^2.1.0 flutter: sdk: flutter - flutter_riverpod: ^3.1.0 + flutter_riverpod: ^3.4.2 + material_ui: ^1.1.0 meta: '>=1.12.0 <2.0.0' stack_trace: '>=1.11.0 <2.0.0' uniform: ^2.0.7 dev_dependencies: - clean_framework_test: ^0.5.4 + clean_framework_test: ^0.5.5 flutter_test: sdk: flutter - mocktail: ^1.0.4 - very_good_analysis: ^10.0.0 + mocktail: ^1.0.5 + very_good_analysis: ^10.3.0 diff --git a/packages/clean_framework/test/core/app_provider_scope_test.dart b/packages/clean_framework/test/core/app_provider_scope_test.dart index 99bb2c05..a7e80f1f 100644 --- a/packages/clean_framework/test/core/app_provider_scope_test.dart +++ b/packages/clean_framework/test/core/app_provider_scope_test.dart @@ -1,6 +1,6 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; void main() { group('AppProviderScope tests |', () { @@ -53,7 +53,7 @@ void main() { } final ExternalInterfaceProvider - _testExternalInterfaceProvider = ExternalInterfaceProvider( +_testExternalInterfaceProvider = ExternalInterfaceProvider( TestExternalInterface.new, gateways: [_testGatewayProvider], ); @@ -83,8 +83,14 @@ class TestExternalInterface } } -class TestGateway extends Gateway { +class TestGateway + extends + Gateway< + TestDomainToGatewayModel, + TestRequest, + TestSuccessResponse, + TestSuccessInput + > { @override TestRequest buildRequest(TestDomainToGatewayModel output) { return TestRequest(ping: output.ping); diff --git a/packages/clean_framework/test/core/use_case/use_case_provider_test.dart b/packages/clean_framework/test/core/use_case/use_case_provider_test.dart index 6fc6be34..51df268e 100644 --- a/packages/clean_framework/test/core/use_case/use_case_provider_test.dart +++ b/packages/clean_framework/test/core/use_case/use_case_provider_test.dart @@ -1,6 +1,6 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; final _testUseCaseProvider = UseCaseProvider( TestUseCase.new, @@ -18,8 +18,7 @@ final _testUseCaseProvider = UseCaseProvider( ); final AutoDisposeUseCaseProvider - _testUseCaseProvider2 = - UseCaseProvider.autoDispose( +_testUseCaseProvider2 = UseCaseProvider.autoDispose( TestUseCase.new, (bridge) { bridge.connect( @@ -39,15 +38,14 @@ final _testUseCaseProvider3 = UseCaseProvider( ); final AutoDisposeUseCaseProviderFamily - _testUseCaseAutoDisposeFamily = - UseCaseProvider.autoDispose.family( - (name) => TestUseCase(name: name), - (_) {}, -); +_testUseCaseAutoDisposeFamily = UseCaseProvider.autoDispose + .family( + (name) => TestUseCase(name: name), + (_) {}, + ); final UseCaseProviderFamily - _testUseCaseFamily = - UseCaseProvider.family( +_testUseCaseFamily = UseCaseProvider.family( (name) => TestUseCase(name: name), (_) {}, ); @@ -149,8 +147,8 @@ void main() { foo: clicked3 ? 'bar3' : clicked - ? 'bar' - : '', + ? 'bar' + : '', ), ); @@ -244,10 +242,10 @@ void main() { test('use case creation', () { final container = ProviderContainer(); - final pikachuUseCase = - _testUseCaseAutoDisposeFamily('Pikachu').read(container); - final bulbasaurUseCase = - _testUseCaseAutoDisposeFamily('Bulbasaur').read(container); + final pikachuUseCase = _testUseCaseAutoDisposeFamily('Pikachu') + .read(container); + final bulbasaurUseCase = _testUseCaseAutoDisposeFamily('Bulbasaur') + .read(container); expect(pikachuUseCase, isA()); expect(bulbasaurUseCase, isA()); @@ -292,12 +290,12 @@ class NewTestUseCase extends TestUseCase {} class TestUseCase extends UseCase { TestUseCase({this.name = ''}) - : super( - entity: const TestEntity(), - transformers: [ - DomainModelTransformer.from((e) => TestDomainModel(foo: e.foo)), - ], - ); + : super( + entity: const TestEntity(), + transformers: [ + DomainModelTransformer.from((e) => TestDomainModel(foo: e.foo)), + ], + ); final String name; diff --git a/packages/clean_framework/test/presentation/presenter/presenter_test.dart b/packages/clean_framework/test/presentation/presenter/presenter_test.dart index 6fe821e1..f9ec1b98 100644 --- a/packages/clean_framework/test/presentation/presenter/presenter_test.dart +++ b/packages/clean_framework/test/presentation/presenter/presenter_test.dart @@ -1,7 +1,7 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; void main() { group('Presenter tests |', () { @@ -55,37 +55,42 @@ void main() { ); }); - testWidgets('didUpdatePresenter is triggered if presenter property changes', - (tester) async { - final messageNotifier = ValueNotifier(''); - - await tester.pumpWidget( - AppProviderScope( - child: MaterialApp( - home: Scaffold( - body: ValueListenableBuilder( - valueListenable: messageNotifier, - builder: (context, message, _) { - return TestPresenter(message: message); - }, + testWidgets( + 'didUpdatePresenter is triggered if presenter property changes', + (tester) async { + final messageNotifier = ValueNotifier(''); + + await tester.pumpWidget( + AppProviderScope( + child: MaterialApp( + home: Scaffold( + body: ValueListenableBuilder( + valueListenable: messageNotifier, + builder: (context, message, _) { + return TestPresenter(message: message); + }, + ), ), ), ), - ), - ); + ); - expect(find.text('DEFAULT'), findsOneWidget); + expect(find.text('DEFAULT'), findsOneWidget); - messageNotifier.value = 'BAR'; - await tester.pumpAndSettle(); + messageNotifier.value = 'BAR'; + await tester.pumpAndSettle(); - expect( - find.descendant(of: find.byType(SnackBar), matching: find.text('BAR')), - findsOneWidget, - ); + expect( + find.descendant( + of: find.byType(SnackBar), + matching: find.text('BAR'), + ), + findsOneWidget, + ); - messageNotifier.dispose(); - }); + messageNotifier.dispose(); + }, + ); }); } @@ -93,10 +98,10 @@ final UseCaseProvider _testUseCaseProvider = UseCaseProvider(TestUseCase.new); final UseCaseProviderFamily - _testUseCaseProviderFamily = +_testUseCaseProviderFamily = UseCaseProvider.family( - (name) => TestUseCase(name: name), -); + (name) => TestUseCase(name: name), + ); class TestPresenter extends Presenter { @@ -105,41 +110,42 @@ class TestPresenter WidgetBuilder? builder, this.message = '', }) : super( - provider: _testUseCaseProvider, - builder: builder ?? - (context) { - final viewModel = ViewModelScope.of(context); - return Column( - children: [ - Text(viewModel.message), - ElevatedButton( - onPressed: () => viewModel.update('FOO'), - child: const Text('CLICK'), - ), - ], - ); - }, - ); + provider: _testUseCaseProvider, + builder: + builder ?? + (context) { + final viewModel = ViewModelScope.of(context); + return Column( + children: [ + Text(viewModel.message), + ElevatedButton( + onPressed: () => viewModel.update('FOO'), + child: const Text('CLICK'), + ), + ], + ); + }, + ); TestPresenter.family({ super.key, this.message = '', }) : super.family( - family: _testUseCaseProviderFamily, - arg: message, - builder: (context) { - final viewModel = ViewModelScope.of(context); - return Column( - children: [ - Text(viewModel.message), - ElevatedButton( - onPressed: () => viewModel.update('FOO'), - child: const Text('CLICK'), - ), - ], - ); - }, - ); + family: _testUseCaseProviderFamily, + arg: message, + builder: (context) { + final viewModel = ViewModelScope.of(context); + return Column( + children: [ + Text(viewModel.message), + ElevatedButton( + onPressed: () => viewModel.update('FOO'), + child: const Text('CLICK'), + ), + ], + ); + }, + ); final String message; @@ -215,14 +221,14 @@ class TestEntity extends Entity { class TestUseCase extends UseCase { TestUseCase({this.name = ''}) - : super( - entity: const TestEntity(message: 'DEFAULT'), - transformers: [ - DomainModelTransformer.from( - (entity) => TestDomainToUIModel(message: entity.message), - ), - ], - ); + : super( + entity: const TestEntity(message: 'DEFAULT'), + transformers: [ + DomainModelTransformer.from( + (entity) => TestDomainToUIModel(message: entity.message), + ), + ], + ); final String name; diff --git a/packages/clean_framework/test/presentation/ui/ui_test.dart b/packages/clean_framework/test/presentation/ui/ui_test.dart index c0eaa542..0815733e 100644 --- a/packages/clean_framework/test/presentation/ui/ui_test.dart +++ b/packages/clean_framework/test/presentation/ui/ui_test.dart @@ -1,6 +1,6 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import '../presenter/presenter_test.dart'; diff --git a/packages/clean_framework/test/providers/presenter_widget_test.dart b/packages/clean_framework/test/providers/presenter_widget_test.dart index a9612623..5c8dd353 100644 --- a/packages/clean_framework/test/providers/presenter_widget_test.dart +++ b/packages/clean_framework/test/providers/presenter_widget_test.dart @@ -2,21 +2,24 @@ import 'dart:async'; import 'package:clean_framework/clean_framework_legacy.dart'; import 'package:clean_framework_test/clean_framework_test_legacy.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; -final UseCaseProvider provider = - UseCaseProvider((_) => TestUseCase()); +final UseCaseProvider provider = UseCaseProvider( + (_) => TestUseCase(), +); void main() { testWidgets('Presenter initial load', (tester) async { final presenter = TestPresenter( - builder: (TestViewModel viewModel) { + builder: (viewModel) { return Text(viewModel.foo, key: const Key('foo')); }, ); - await ProviderTester() - .pumpWidget(tester, MaterialApp(home: presenter)); + await ProviderTester().pumpWidget( + tester, + MaterialApp(home: presenter), + ); expect(find.byKey(const Key('foo')), findsOneWidget); expect(find.text('INITIAL'), findsOneWidget); @@ -71,7 +74,7 @@ void main() { class TestPresenter extends Presenter { TestPresenter({required super.builder, super.key, this.count}) - : super(provider: provider); + : super(provider: provider); final int? count; @@ -107,14 +110,14 @@ class TestPresenter class TestUseCase extends UseCase { TestUseCase() - : super( - entity: const EntityFake(), - transformers: [ - DomainModelTransformer.from( - (entity) => TestDomainModel(entity.value), - ), - ], - ); + : super( + entity: const EntityFake(), + transformers: [ + DomainModelTransformer.from( + (entity) => TestDomainModel(entity.value), + ), + ], + ); Future fetch() async { entity = const EntityFake(value: 'a'); @@ -137,7 +140,7 @@ class TestViewModel extends ViewModel { const TestViewModel(this.foo); TestViewModel.fromOutput(TestDomainModel output) - : foo = output.foo.toUpperCase(); + : foo = output.foo.toUpperCase(); final String foo; @override diff --git a/packages/clean_framework/test/providers/providers_test.dart b/packages/clean_framework/test/providers/providers_test.dart index ef2a0b2d..dec972fc 100644 --- a/packages/clean_framework/test/providers/providers_test.dart +++ b/packages/clean_framework/test/providers/providers_test.dart @@ -1,6 +1,6 @@ import 'package:clean_framework/clean_framework_legacy.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; void main() { testWidgets('AppProviderContainer', (tester) async { diff --git a/packages/clean_framework/test/providers/ui_test.dart b/packages/clean_framework/test/providers/ui_test.dart index 0082e2ab..b9ea2322 100644 --- a/packages/clean_framework/test/providers/ui_test.dart +++ b/packages/clean_framework/test/providers/ui_test.dart @@ -1,7 +1,7 @@ import 'package:clean_framework/clean_framework_legacy.dart'; import 'package:clean_framework_test/clean_framework_test_legacy.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; void main() { TestWidgetsFlutterBinding.ensureInitialized(); @@ -66,9 +66,9 @@ class TestUI extends UI { class PresenterFake extends Presenter { PresenterFake({required super.builder, super.key}) - : super( - provider: UseCaseProvider((_) => UseCaseFake()), - ); + : super( + provider: UseCaseProvider((_) => UseCaseFake()), + ); @override TestDomainModel subscribe(_) => const TestDomainModel('bar'); diff --git a/packages/clean_framework/test/widgets/feature_builder_test.dart b/packages/clean_framework/test/widgets/feature_builder_test.dart index 333a832b..c3217289 100644 --- a/packages/clean_framework/test/widgets/feature_builder_test.dart +++ b/packages/clean_framework/test/widgets/feature_builder_test.dart @@ -1,7 +1,7 @@ import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework/clean_framework_defaults.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; void main() { group('FeatureBuilder tests ||', () { @@ -325,7 +325,7 @@ class FakeJsonFeatureProvider extends JsonFeatureProvider { 'conditions': [ {'context': 'platform', 'op': 'equals', 'value': 'android'}, ], - } + }, ], }, }, diff --git a/packages/clean_framework/theme_example/analysis_options.yaml b/packages/clean_framework/theme_example/analysis_options.yaml index 0d290213..bf8d4218 100644 --- a/packages/clean_framework/theme_example/analysis_options.yaml +++ b/packages/clean_framework/theme_example/analysis_options.yaml @@ -7,6 +7,15 @@ # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. +analyzer: + exclude: + - build/** + - android/** + - ios/** + - web/** + - windows/** + - macos/** + - linux/** include: package:flutter_lints/flutter.yaml linter: diff --git a/packages/clean_framework/theme_example/lib/app/theme_example_app.dart b/packages/clean_framework/theme_example/lib/app/theme_example_app.dart index f5bacb72..580136b5 100644 --- a/packages/clean_framework/theme_example/lib/app/theme_example_app.dart +++ b/packages/clean_framework/theme_example/lib/app/theme_example_app.dart @@ -1,13 +1,11 @@ import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework_router/clean_framework_router.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:theme_example/features/home/presentation/theme/home_theme_ui.dart'; import 'package:theme_example/router.dart'; class ThemeExampleApp extends StatelessWidget { - const ThemeExampleApp({ - super.key, - }); + const ThemeExampleApp({super.key}); @override Widget build(BuildContext context) { diff --git a/packages/clean_framework/theme_example/lib/features/home/presentation/home_presenter.dart b/packages/clean_framework/theme_example/lib/features/home/presentation/home_presenter.dart index 5dde8079..9d416c3e 100644 --- a/packages/clean_framework/theme_example/lib/features/home/presentation/home_presenter.dart +++ b/packages/clean_framework/theme_example/lib/features/home/presentation/home_presenter.dart @@ -1,5 +1,5 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:theme_example/features/home/domain/home_domain_models.dart'; import 'package:theme_example/features/home/domain/home_use_case.dart'; import 'package:theme_example/features/home/presentation/home_view_model.dart'; @@ -7,14 +7,14 @@ import 'package:theme_example/providers.dart'; class HomePresenter extends Presenter { - HomePresenter({ - required super.builder, - super.key, - }) : super(provider: homeUseCaseProvider); + HomePresenter({required super.builder, super.key}) + : super(provider: homeUseCaseProvider); @override HomeViewModel createViewModel( - HomeUseCase useCase, HomeDomainToUIModel domainModel) { + HomeUseCase useCase, + HomeDomainToUIModel domainModel, + ) { return HomeViewModel( appTheme: domainModel.appTheme, onThemeChange: useCase.updateTheme, diff --git a/packages/clean_framework/theme_example/lib/features/home/presentation/home_ui.dart b/packages/clean_framework/theme_example/lib/features/home/presentation/home_ui.dart index 3be4ab77..1fd13ac1 100644 --- a/packages/clean_framework/theme_example/lib/features/home/presentation/home_ui.dart +++ b/packages/clean_framework/theme_example/lib/features/home/presentation/home_ui.dart @@ -1,5 +1,5 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:theme_example/features/home/domain/home_entity.dart'; import 'package:theme_example/features/home/presentation/home_presenter.dart'; import 'package:theme_example/features/home/presentation/home_view_model.dart'; diff --git a/packages/clean_framework/theme_example/lib/features/home/presentation/home_view_model.dart b/packages/clean_framework/theme_example/lib/features/home/presentation/home_view_model.dart index 43bd76e6..dfdd031a 100644 --- a/packages/clean_framework/theme_example/lib/features/home/presentation/home_view_model.dart +++ b/packages/clean_framework/theme_example/lib/features/home/presentation/home_view_model.dart @@ -1,19 +1,14 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:theme_example/features/home/domain/home_entity.dart'; class HomeViewModel extends ViewModel { - const HomeViewModel({ - required this.appTheme, - required this.onThemeChange, - }); + const HomeViewModel({required this.appTheme, required this.onThemeChange}); final AppTheme appTheme; final ValueChanged onThemeChange; @override - List get props => [ - appTheme, - ]; + List get props => [appTheme]; } diff --git a/packages/clean_framework/theme_example/lib/features/home/presentation/theme/home_theme_presenter.dart b/packages/clean_framework/theme_example/lib/features/home/presentation/theme/home_theme_presenter.dart index 9bf64e53..d820e786 100644 --- a/packages/clean_framework/theme_example/lib/features/home/presentation/theme/home_theme_presenter.dart +++ b/packages/clean_framework/theme_example/lib/features/home/presentation/theme/home_theme_presenter.dart @@ -1,23 +1,22 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:theme_example/features/home/domain/home_domain_models.dart'; import 'package:theme_example/features/home/domain/home_use_case.dart'; import 'package:theme_example/features/home/presentation/theme/home_theme_view_model.dart'; import 'package:theme_example/providers.dart'; -class HomeThemePresenter extends Presenter { - HomeThemePresenter({ - required super.builder, - super.key, - }) : super(provider: homeUseCaseProvider); +class HomeThemePresenter + extends + Presenter { + HomeThemePresenter({required super.builder, super.key}) + : super(provider: homeUseCaseProvider); @override HomeThemeViewModel createViewModel( - HomeUseCase useCase, HomeThemeDomainToUIModel domainModel) { - return HomeThemeViewModel( - appTheme: domainModel.appTheme, - ); + HomeUseCase useCase, + HomeThemeDomainToUIModel domainModel, + ) { + return HomeThemeViewModel(appTheme: domainModel.appTheme); } @override diff --git a/packages/clean_framework/theme_example/lib/features/home/presentation/theme/home_theme_ui.dart b/packages/clean_framework/theme_example/lib/features/home/presentation/theme/home_theme_ui.dart index 64d54794..0a960259 100644 --- a/packages/clean_framework/theme_example/lib/features/home/presentation/theme/home_theme_ui.dart +++ b/packages/clean_framework/theme_example/lib/features/home/presentation/theme/home_theme_ui.dart @@ -1,14 +1,11 @@ import 'package:clean_framework/clean_framework.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:theme_example/features/home/domain/home_entity.dart'; import 'package:theme_example/features/home/presentation/theme/home_theme_presenter.dart'; import 'package:theme_example/features/home/presentation/theme/home_theme_view_model.dart'; class ExampleThemeModeWrapper extends UI { - ExampleThemeModeWrapper({ - required this.builder, - super.key, - }); + ExampleThemeModeWrapper({required this.builder, super.key}); final Widget Function(BuildContext, ThemeMode) builder; @@ -18,12 +15,7 @@ class ExampleThemeModeWrapper extends UI { @override Widget build(BuildContext context, HomeThemeViewModel viewModel) { - return builder( - context, - _getThemeMode( - viewModel.appTheme, - ), - ); + return builder(context, _getThemeMode(viewModel.appTheme)); } ThemeMode _getThemeMode(AppTheme theme) { diff --git a/packages/clean_framework/theme_example/lib/main.dart b/packages/clean_framework/theme_example/lib/main.dart index aafe3afc..a66e184b 100644 --- a/packages/clean_framework/theme_example/lib/main.dart +++ b/packages/clean_framework/theme_example/lib/main.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:theme_example/app/theme_example_app.dart'; void main() { diff --git a/packages/clean_framework/theme_example/pubspec.yaml b/packages/clean_framework/theme_example/pubspec.yaml index 9d8eb136..faca6c7d 100644 --- a/packages/clean_framework/theme_example/pubspec.yaml +++ b/packages/clean_framework/theme_example/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=3.8.0 <4.0.0' + sdk: ">=3.13.0 <4.0.0" resolution: workspace @@ -35,7 +35,7 @@ dependencies: flutter: sdk: flutter - + material_ui: ^1.1.0 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. diff --git a/packages/clean_framework_firestore/pubspec.yaml b/packages/clean_framework_firestore/pubspec.yaml index 29ee3ac0..401b4877 100644 --- a/packages/clean_framework_firestore/pubspec.yaml +++ b/packages/clean_framework_firestore/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://acmesoftware.com/ repository: https://github.com/AcmeSoftwareLLC/clean_framework/packages/clean_framework_firestore environment: - sdk: '>=3.8.0 <4.0.0' - flutter: '>=3.32.0' + sdk: ">=3.13.0 <4.0.0" + flutter: ">=3.47.0" resolution: workspace diff --git a/packages/clean_framework_graphql/graphql_example/analysis_options.yaml b/packages/clean_framework_graphql/graphql_example/analysis_options.yaml index 0d290213..bf8d4218 100644 --- a/packages/clean_framework_graphql/graphql_example/analysis_options.yaml +++ b/packages/clean_framework_graphql/graphql_example/analysis_options.yaml @@ -7,6 +7,15 @@ # The following line activates a set of recommended lints for Flutter apps, # packages, and plugins designed to encourage good coding practices. +analyzer: + exclude: + - build/** + - android/** + - ios/** + - web/** + - windows/** + - macos/** + - linux/** include: package:flutter_lints/flutter.yaml linter: diff --git a/packages/clean_framework_graphql/graphql_example/pubspec.yaml b/packages/clean_framework_graphql/graphql_example/pubspec.yaml index 6ac969d0..19f9305e 100644 --- a/packages/clean_framework_graphql/graphql_example/pubspec.yaml +++ b/packages/clean_framework_graphql/graphql_example/pubspec.yaml @@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=3.8.0 <4.0.0' + sdk: ">=3.13.0 <4.0.0" resolution: workspace diff --git a/packages/clean_framework_graphql/pubspec.yaml b/packages/clean_framework_graphql/pubspec.yaml index 84e7f588..ea194e61 100644 --- a/packages/clean_framework_graphql/pubspec.yaml +++ b/packages/clean_framework_graphql/pubspec.yaml @@ -5,8 +5,8 @@ homepage: https://acmesoftware.com/ repository: https://github.com/AcmeSoftwareLLC/clean_framework/packages/clean_framework_graphql environment: - sdk: '>=3.8.0 <4.0.0' - flutter: '>=3.32.0' + sdk: ">=3.13.0 <4.0.0" + flutter: ">=3.47.0" resolution: workspace diff --git a/packages/clean_framework_graphql/test/graphql_external_interface_test.dart b/packages/clean_framework_graphql/test/graphql_external_interface_test.dart deleted file mode 100644 index 7d5baef9..00000000 --- a/packages/clean_framework_graphql/test/graphql_external_interface_test.dart +++ /dev/null @@ -1,238 +0,0 @@ -import 'package:clean_framework/clean_framework_legacy.dart'; -import 'package:clean_framework_graphql/clean_framework_graphql.dart'; -import 'package:flutter_test/flutter_test.dart'; - -// TODO(Chris): Fix these tests for non-legacy clean framework. -void main() { - group('GraphQLExternalInterface | ', () { - // test('success response', () async { - // final gateway = GatewayFake(UseCaseFake()); - - // // For coverage purposes - // GraphQLExternalInterface(link: '', gatewayConnections: []); - - // GraphQLExternalInterface.withService( - // gatewayConnections: [() => gateway], - // service: GraphQLServiceFake({'foo': 'bar'}), - // ); - - // final result = await gateway.transport(SuccessfulRequest()); - // expect(result.isRight, isTrue); - // expect( - // result.right, const GraphQLSuccessResponse(data: {'foo': 'bar'})); - // }); - - // test('failure response', () async { - // final gateway = GatewayFake(UseCaseFake()); - - // GraphQLExternalInterface.withService( - // gatewayConnections: [() => gateway], - // service: GraphQLServiceFake({}), - // ); - - // final result = await gateway.transport(SuccessfulRequest()); - // expect(result.isLeft, isTrue); - - // expect( - // result.left, - // isA().having( - // (r) => r.message, - // 'message', - // 'service exception', - // ), - // ); - // }); - - // test('success with mutation', () async { - // final gateway = GatewayFake(UseCaseFake()); - - // GraphQLExternalInterface.withService( - // gatewayConnections: [() => gateway], - // service: GraphQLServiceFake({'foo': 'bar'}), - // ); - - // final result = await gateway.transport(MutationRequest()); - // expect(result.isRight, isTrue); - // expect(result.right, const GraphQLSuccessResponse(data: {'foo': 'bar'}) - // ); - // }); - - // test('failure with mutation', () async { - // final gateway = GatewayFake(UseCaseFake()); - - // GraphQLExternalInterface.withService( - // gatewayConnections: [() => gateway], - // service: GraphQLServiceFake({}), - // ); - - // final result = await gateway.transport(MutationRequest()); - // expect(result.isLeft, isTrue); - // expect( - // result.left, - // isA().having( - // (r) => r.message, - // 'message', - // 'service exception', - // ), - // ); - // }); - - // test('operation exception', () async { - // final gateway = GatewayFake(UseCaseFake()); - - // GraphQLExternalInterface.withService( - // gatewayConnections: [() => gateway], - // service: GraphQLServiceFake.exception( - // GraphQLOperationException(errors: []), - // ), - // ); - - // final result = await gateway.transport(MutationRequest()); - // expect(result.isLeft, isTrue); - // expect( - // result.left, - // const GraphQLFailureResponse(type: GraphQLFailureType.operation), - // ); - // }); - - // test('network exception', () async { - // final gateway = GatewayFake(UseCaseFake()); - - // GraphQLExternalInterface.withService( - // gatewayConnections: [() => gateway], - // service: GraphQLServiceFake.exception( - // GraphQLNetworkException( - // message: 'no internet', - // uri: Uri.parse('https://acmesoftware.com'), - // ), - // ), - // ); - - // final result = await gateway.transport(MutationRequest()); - // expect(result.isLeft, isTrue); - // expect( - // result.left, - // const GraphQLFailureResponse( - // type: GraphQLFailureType.network, - // message: 'no internet', - // errorData: {'url': 'https://acmesoftware.com'}, - // ), - // ); - // }); - - // test('server exception', () async { - // final gateway = GatewayFake(UseCaseFake()); - - // GraphQLExternalInterface.withService( - // gatewayConnections: [() => gateway], - // service: GraphQLServiceFake.exception( - // GraphQLServerException( - // originalException: const FormatException(), - // errorData: const {}, - // ), - // ), - // ); - - // final result = await gateway.transport(MutationRequest()); - // expect(result.isLeft, isTrue); - // expect( - // result.left, - // const GraphQLFailureResponse( - // type: GraphQLFailureType.server, - // message: 'FormatException', - // ), - // ); - // }); - - // test('timeout exception', () async { - // final gateway = GatewayFake(UseCaseFake()); - - // GraphQLExternalInterface( - // link: 'https://acmesoftware.com', - // gatewayConnections: [() => gateway], - // timeout: Duration.zero, - // ); - - // final result = await gateway.transport(MutationRequest()); - // expect(result.isLeft, isTrue); - // expect( - // result.left, - // const GraphQLFailureResponse( - // type: GraphQLFailureType.timeout, - // message: 'Connection Timeout', - // ), - // ); - // }); - }); -} - -class GraphQLServiceFake extends Fake implements GraphQLService { - GraphQLServiceFake(this._json) - : _exception = _json.isEmpty ? 'service exception' : null; - - GraphQLServiceFake.exception(GraphQLServiceException exception) - : _exception = exception, - _json = const {}; - - final Map _json; - final Object? _exception; - - @override - Future request({ - required GraphQLMethod method, - required String document, - Map? variables, - Duration? timeout, - GraphQLFetchPolicy? fetchPolicy, - GraphQLErrorPolicy? errorPolicy, - }) async { - if (_exception != null) throw _exception; - - return GraphQLServiceResponse( - data: _json, - errors: [], - ); - } -} - -class GatewayFake extends GraphQLGateway { - GatewayFake(UseCase useCase) : super(useCase: useCase); - - @override - MutationRequest buildRequest(DomainModel domainModel) { - return MutationRequest(); - } - - @override - SuccessDomainInput onSuccess(GraphQLSuccessResponse response) { - return const SuccessDomainInput(); - } -} - -class MutationGatewayFake extends GraphQLGateway { - MutationGatewayFake(UseCase useCase) : super(useCase: useCase); - - @override - SuccessfulRequest buildRequest(DomainModel domainModel) { - return SuccessfulRequest(); - } - - @override - SuccessDomainInput onSuccess(GraphQLSuccessResponse response) { - return const SuccessDomainInput(); - } -} - -class SuccessfulRequest extends QueryGraphQLRequest { - @override - String get document => ''' - - '''; -} - -class MutationRequest extends MutationGraphQLRequest { - @override - String get document => ''' - - '''; -} diff --git a/packages/clean_framework_http/CHANGELOG.md b/packages/clean_framework_http/CHANGELOG.md index 8f0f5ab6..068a1e63 100644 --- a/packages/clean_framework_http/CHANGELOG.md +++ b/packages/clean_framework_http/CHANGELOG.md @@ -1,4 +1,9 @@ # Changelog +## 1.0.2 +**Sep 1, 2026** +- Bumps dependencies to latest version. +- Adopts Dart primary constructors for applicable classes. + ## 1.0.1 **Jan 12, 2026** - Bumps dependencies to latest version. diff --git a/packages/clean_framework_http/example/lib/app/clean_framework_http_example_app.dart b/packages/clean_framework_http/example/lib/app/clean_framework_http_example_app.dart index ec3708c7..58e12cff 100644 --- a/packages/clean_framework_http/example/lib/app/clean_framework_http_example_app.dart +++ b/packages/clean_framework_http/example/lib/app/clean_framework_http_example_app.dart @@ -2,7 +2,7 @@ import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework_http_example/providers.dart'; import 'package:clean_framework_http_example/routing.dart'; import 'package:clean_framework_router/clean_framework_router.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class CleanFrameworkHttpExampleApp extends StatelessWidget { const CleanFrameworkHttpExampleApp({super.key}); diff --git a/packages/clean_framework_http/example/lib/features/home/presentation/home_presenter.dart b/packages/clean_framework_http/example/lib/features/home/presentation/home_presenter.dart index 27693654..c14f5053 100644 --- a/packages/clean_framework_http/example/lib/features/home/presentation/home_presenter.dart +++ b/packages/clean_framework_http/example/lib/features/home/presentation/home_presenter.dart @@ -5,7 +5,7 @@ import 'package:clean_framework_http_example/features/home/domain/home_domain_mo import 'package:clean_framework_http_example/features/home/domain/home_use_case.dart'; import 'package:clean_framework_http_example/features/home/presentation/home_view_model.dart'; import 'package:clean_framework_http_example/providers.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; class HomePresenter extends Presenter { diff --git a/packages/clean_framework_http/example/lib/features/home/presentation/home_ui.dart b/packages/clean_framework_http/example/lib/features/home/presentation/home_ui.dart index 1e769844..6e66b7db 100644 --- a/packages/clean_framework_http/example/lib/features/home/presentation/home_ui.dart +++ b/packages/clean_framework_http/example/lib/features/home/presentation/home_ui.dart @@ -1,8 +1,8 @@ import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework_http_example/features/home/presentation/home_presenter.dart'; import 'package:clean_framework_http_example/features/home/presentation/home_view_model.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_svg_image/flutter_svg_image.dart'; +import 'package:material_ui/material_ui.dart'; class HomeUI extends UI { HomeUI({super.key}); @@ -14,9 +14,9 @@ class HomeUI extends UI { @override Widget build(BuildContext context, HomeViewModel viewModel) { final titleStyle = Theme.of(context).textTheme.titleLarge!.copyWith( - color: Theme.of(context).colorScheme.onPrimaryContainer, - fontWeight: FontWeight.w300, - ); + color: Theme.of(context).colorScheme.onPrimaryContainer, + fontWeight: FontWeight.w300, + ); return Scaffold( appBar: AppBar(title: const Text('Pokemons')), diff --git a/packages/clean_framework_http/example/lib/main.dart b/packages/clean_framework_http/example/lib/main.dart index 1a79edb4..c97990bf 100644 --- a/packages/clean_framework_http/example/lib/main.dart +++ b/packages/clean_framework_http/example/lib/main.dart @@ -1,5 +1,5 @@ import 'package:clean_framework_http_example/app/clean_framework_http_example_app.dart'; -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:shared_preferences/shared_preferences.dart'; Future main() async { diff --git a/packages/clean_framework_http/example/linux/flutter/generated_plugins.cmake b/packages/clean_framework_http/example/linux/flutter/generated_plugins.cmake index 2e1de87a..be1ee3e5 100644 --- a/packages/clean_framework_http/example/linux/flutter/generated_plugins.cmake +++ b/packages/clean_framework_http/example/linux/flutter/generated_plugins.cmake @@ -6,6 +6,7 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/packages/clean_framework_http/example/pubspec.yaml b/packages/clean_framework_http/example/pubspec.yaml index eeec52b8..83e06eb9 100644 --- a/packages/clean_framework_http/example/pubspec.yaml +++ b/packages/clean_framework_http/example/pubspec.yaml @@ -5,7 +5,7 @@ publish_to: none version: 1.0.0+1 environment: - sdk: '>=3.8.0 <4.0.0' + sdk: ">=3.13.0 <4.0.0" resolution: workspace @@ -18,6 +18,7 @@ dependencies: sdk: flutter flutter_svg_image: ^1.1.0+1 http_cache_sembast_store: ^1.0.0 + material_ui: ^1.1.0 path_provider: ^2.1.4 pretty_dio_logger: ^1.4.0 shared_preferences: ^2.3.2 diff --git a/packages/clean_framework_http/example/windows/flutter/generated_plugins.cmake b/packages/clean_framework_http/example/windows/flutter/generated_plugins.cmake index 61c79a21..3f596f9a 100644 --- a/packages/clean_framework_http/example/windows/flutter/generated_plugins.cmake +++ b/packages/clean_framework_http/example/windows/flutter/generated_plugins.cmake @@ -7,6 +7,7 @@ list(APPEND FLUTTER_PLUGIN_LIST ) list(APPEND FLUTTER_FFI_PLUGIN_LIST + jni ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/packages/clean_framework_http/lib/src/http_external_interface.dart b/packages/clean_framework_http/lib/src/http_external_interface.dart index 4a8c896f..2a0ae9f2 100644 --- a/packages/clean_framework_http/lib/src/http_external_interface.dart +++ b/packages/clean_framework_http/lib/src/http_external_interface.dart @@ -34,7 +34,7 @@ class HttpExternalInterface final rootHeaders = await delegate.buildHeaders(); final headers = { ...request.headers, - if (rootHeaders != null) ...rootHeaders, + ...?rootHeaders, }; var options = Options( @@ -101,28 +101,27 @@ class HttpExternalInterface if (error is DioException) { return switch (error.type) { DioExceptionType.badResponse => HttpFailureResponse( - message: error.message ?? '', - path: error.requestOptions.path, - statusCode: error.response?.statusCode ?? 0, - error: error.response?.data, - stackTrace: error.stackTrace, - ), + message: error.message ?? '', + path: error.requestOptions.path, + statusCode: error.response?.statusCode ?? 0, + error: error.response?.data, + stackTrace: error.stackTrace, + ), DioExceptionType.connectionTimeout || DioExceptionType.sendTimeout || DioExceptionType.receiveTimeout || DioExceptionType.badCertificate || - DioExceptionType.connectionError => - ConnectionHttpFailureResponse( - type: HttpErrorType.values.byName(error.type.name), - message: error.message ?? '', - path: error.requestOptions.path, - error: error.error, - stackTrace: error.stackTrace, - ), + DioExceptionType.connectionError => ConnectionHttpFailureResponse( + type: HttpErrorType.values.byName(error.type.name), + message: error.message ?? '', + path: error.requestOptions.path, + error: error.error, + stackTrace: error.stackTrace, + ), DioExceptionType.cancel => CancelledHttpFailureResponse( - message: error.message ?? '', - path: error.requestOptions.path, - ), + message: error.message ?? '', + path: error.requestOptions.path, + ), _ => UnknownFailureResponse(error), }; } diff --git a/packages/clean_framework_http/lib/src/http_options.dart b/packages/clean_framework_http/lib/src/http_options.dart index 30cb1024..9aa001ad 100644 --- a/packages/clean_framework_http/lib/src/http_options.dart +++ b/packages/clean_framework_http/lib/src/http_options.dart @@ -1,31 +1,21 @@ import 'package:clean_framework_http/clean_framework_http.dart'; -class HttpOptions { - const HttpOptions({ - this.baseUrl = '', - this.connectTimeout, - this.receiveTimeout, - this.sendTimeout, - this.validateStatus, - this.responseType = HttpResponseType.json, - }); - - final String baseUrl; +class const HttpOptions({ + final String baseUrl = '', /// Timeout for opening url. - final Duration? connectTimeout; + final Duration? connectTimeout, /// Timeout for receiving data. - final Duration? receiveTimeout; + final Duration? receiveTimeout, /// Timeout for sending data. - final Duration? sendTimeout; + final Duration? sendTimeout, /// `validateStatus` defines whether the request is successful for a given /// HTTP response status code. If `validateStatus` returns `true` , /// the request will be perceived as successful; /// otherwise, considered as failed. - final bool Function(int? status)? validateStatus; - - final HttpResponseType responseType; -} + final bool Function(int? status)? validateStatus, + final HttpResponseType responseType = HttpResponseType.json, +}); diff --git a/packages/clean_framework_http/lib/src/requests.dart b/packages/clean_framework_http/lib/src/requests.dart index 32661334..80f0f088 100644 --- a/packages/clean_framework_http/lib/src/requests.dart +++ b/packages/clean_framework_http/lib/src/requests.dart @@ -2,16 +2,12 @@ import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework_http/clean_framework_http.dart'; /// The HTTP Request methods. -abstract class HttpRequest extends Request { - /// Creates a new [HttpRequest] with the given [method] and [cancelToken]. - const HttpRequest(this.method, {this.cancelToken}); - +abstract class const HttpRequest( /// The HTTP method to be used. - final HttpMethods method; - + final HttpMethods method, { /// The token to cancel the request. - final HttpCancelToken? cancelToken; - + final HttpCancelToken? cancelToken, +}) extends Request { /// The path of the request. String get path; diff --git a/packages/clean_framework_http/lib/src/responses.dart b/packages/clean_framework_http/lib/src/responses.dart index 446e2159..77eb414a 100644 --- a/packages/clean_framework_http/lib/src/responses.dart +++ b/packages/clean_framework_http/lib/src/responses.dart @@ -2,67 +2,43 @@ import 'package:clean_framework/clean_framework.dart'; typedef Json = Map; -abstract class HttpSuccessResponse extends SuccessResponse { - const HttpSuccessResponse(this.data, this.statusCode); - - final T data; - final int? statusCode; -} - -class PlainHttpSuccessResponse extends HttpSuccessResponse { - const PlainHttpSuccessResponse(super.data, super.statusCode); -} - -class JsonHttpSuccessResponse extends HttpSuccessResponse { - const JsonHttpSuccessResponse(super.data, super.statusCode); -} - -class JsonArrayHttpSuccessResponse extends HttpSuccessResponse> { - const JsonArrayHttpSuccessResponse(super.data, super.statusCode); -} - -class BytesHttpSuccessResponse extends HttpSuccessResponse> { - const BytesHttpSuccessResponse(super.data, super.statusCode); -} - -class HttpFailureResponse extends FailureResponse { - const HttpFailureResponse({ - required this.path, - required this.statusCode, - required super.message, - required this.error, - required this.stackTrace, - }); - - final String path; - final int statusCode; - final Object? error; - final StackTrace? stackTrace; -} - -class CancelledHttpFailureResponse extends FailureResponse { - const CancelledHttpFailureResponse({ - required super.message, - required this.path, - }); - - final String path; -} - -class ConnectionHttpFailureResponse - extends TypedFailureResponse { - const ConnectionHttpFailureResponse({ - required super.type, - required super.message, - required this.path, - required this.error, - required this.stackTrace, - }); - - final String path; - final Object? error; - final StackTrace? stackTrace; -} +abstract class const HttpSuccessResponse( + final T data, + final int? statusCode, +) extends SuccessResponse; + +class const PlainHttpSuccessResponse(super.data, super.statusCode) + extends HttpSuccessResponse; + +class const JsonHttpSuccessResponse(super.data, super.statusCode) + extends HttpSuccessResponse; + +class const JsonArrayHttpSuccessResponse(super.data, super.statusCode) + extends HttpSuccessResponse>; + +class const BytesHttpSuccessResponse(super.data, super.statusCode) + extends HttpSuccessResponse>; + +class const HttpFailureResponse({ + required final String path, + required final int statusCode, + required super.message, + required final Object? error, + required final StackTrace? stackTrace, +}) extends FailureResponse; + +class const CancelledHttpFailureResponse({ + required super.message, + required final String path, +}) extends FailureResponse; + +class const ConnectionHttpFailureResponse({ + required super.type, + required super.message, + required final String path, + required final Object? error, + required final StackTrace? stackTrace, +}) extends TypedFailureResponse; enum HttpErrorType { connectionTimeout, diff --git a/packages/clean_framework_http/pubspec.yaml b/packages/clean_framework_http/pubspec.yaml index 8e5d5fe2..1240b2c4 100644 --- a/packages/clean_framework_http/pubspec.yaml +++ b/packages/clean_framework_http/pubspec.yaml @@ -1,26 +1,26 @@ name: clean_framework_http description: External Interface for clean_framework package based on Dio. -version: 1.0.1 +version: 1.0.2 homepage: https://acmesoftware.com repository: https://github.com/AcmeSoftwareLLC/clean_framework/tree/main/packages/clean_framework_http environment: - sdk: '>=3.8.0 <4.0.0' - flutter: '>=3.32.0' + sdk: ">=3.13.0 <4.0.0" + flutter: ">=3.47.0" resolution: workspace dependencies: - clean_framework: ^4.1.3 + clean_framework: ^4.1.4 - dio: ^5.9.0 - dio_cache_interceptor: ^4.0.5 + dio: ^5.11.0 + dio_cache_interceptor: ^4.0.7 flutter: sdk: flutter dev_dependencies: - clean_framework_test: ^0.5.4 + clean_framework_test: ^0.5.5 flutter_test: sdk: flutter - very_good_analysis: ^10.0.0 \ No newline at end of file + very_good_analysis: ^10.3.0 \ No newline at end of file diff --git a/packages/clean_framework_router/CHANGELOG.md b/packages/clean_framework_router/CHANGELOG.md index c565993a..e5f63414 100644 --- a/packages/clean_framework_router/CHANGELOG.md +++ b/packages/clean_framework_router/CHANGELOG.md @@ -1,4 +1,10 @@ # Changelog +## 0.5.14 +**Sep 1, 2026** +- Bumps dependencies to latest version. +- Adopts Dart primary constructors for applicable classes. +- Switches from `package:flutter/material.dart` to `package:material_ui/material_ui.dart`. + ## 0.5.13 **Jan 12, 2026** - Bump dependency to latest version. diff --git a/packages/clean_framework_router/lib/main.dart b/packages/clean_framework_router/lib/main.dart index 5ba92432..370a561a 100644 --- a/packages/clean_framework_router/lib/main.dart +++ b/packages/clean_framework_router/lib/main.dart @@ -1,4 +1,4 @@ -import 'package:flutter/material.dart'; +import 'package:material_ui/material_ui.dart'; void main() { runApp(const MyApp()); diff --git a/packages/clean_framework_router/pubspec.yaml b/packages/clean_framework_router/pubspec.yaml index fcfdd597..35711c88 100644 --- a/packages/clean_framework_router/pubspec.yaml +++ b/packages/clean_framework_router/pubspec.yaml @@ -1,23 +1,24 @@ name: clean_framework_router description: A wrapper around go_router to make it easier to use with clean_framework. -version: 0.5.13 +version: 0.5.14 homepage: https://acmesoftware.com/ repository: https://github.com/AcmeSoftwareLLC/clean_framework/tree/main/packages/clean_framework_router environment: - sdk: '>=3.8.0 <4.0.0' - flutter: '>=3.32.0' + sdk: ">=3.13.0 <4.0.0" + flutter: ">=3.47.0" resolution: workspace dependencies: - clean_framework: ^4.1.3 + clean_framework: ^4.1.4 flutter: sdk: flutter - go_router: ^17.0.1 + go_router: ^18.0.0 + material_ui: ^1.1.0 dev_dependencies: flutter_test: sdk: flutter - very_good_analysis: ^10.0.0 + very_good_analysis: ^10.3.0 diff --git a/packages/clean_framework_router/test/app_router_test.dart b/packages/clean_framework_router/test/app_router_test.dart index 522a40f5..05efd239 100644 --- a/packages/clean_framework_router/test/app_router_test.dart +++ b/packages/clean_framework_router/test/app_router_test.dart @@ -1,8 +1,8 @@ import 'package:clean_framework_router/clean_framework_router.dart'; import 'package:flutter/cupertino.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:go_router/go_router.dart'; +import 'package:material_ui/material_ui.dart'; enum Routes with RoutesMixin { home('/'), @@ -1241,13 +1241,12 @@ Future pumpApp(WidgetTester tester) { ); } -class OnTapPage extends StatelessWidget { - const OnTapPage({required this.id, super.key, this.onTap, this.value}); - - final String id; - final void Function(BuildContext)? onTap; - final String? value; - +class const OnTapPage({ + required final String id, + super.key, + final void Function(BuildContext)? onTap, + final String? value, +}) extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( diff --git a/packages/clean_framework_test/CHANGELOG.md b/packages/clean_framework_test/CHANGELOG.md index 13777414..0ab2e26d 100644 --- a/packages/clean_framework_test/CHANGELOG.md +++ b/packages/clean_framework_test/CHANGELOG.md @@ -1,4 +1,10 @@ # Changelog +## 0.5.5 +**Sep 1, 2026** +- Bumps dependencies to latest version. +- Adopts Dart primary constructors for applicable classes. +- Switches from `package:flutter/material.dart` to `package:material_ui/material_ui.dart`. + ## 0.5.4 **Jan 12, 2026** - Bump dependency to latest version. diff --git a/packages/clean_framework_test/lib/src/presenter_test.dart b/packages/clean_framework_test/lib/src/presenter_test.dart index 56245809..bc96a505 100644 --- a/packages/clean_framework_test/lib/src/presenter_test.dart +++ b/packages/clean_framework_test/lib/src/presenter_test.dart @@ -4,11 +4,11 @@ import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework_router/clean_framework_router.dart'; import 'package:clean_framework_test/src/diff.dart'; import 'package:clean_framework_test/src/ui_test.dart'; -import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/misc.dart'; import 'package:flutter_test/flutter_test.dart' as ft; +import 'package:material_ui/material_ui.dart'; import 'package:meta/meta.dart'; @isTest diff --git a/packages/clean_framework_test/lib/src/test_helpers.dart b/packages/clean_framework_test/lib/src/test_helpers.dart index 34df539a..d0b992eb 100644 --- a/packages/clean_framework_test/lib/src/test_helpers.dart +++ b/packages/clean_framework_test/lib/src/test_helpers.dart @@ -2,9 +2,9 @@ import 'dart:async'; import 'package:clean_framework/clean_framework_legacy.dart'; import 'package:clean_framework_router/clean_framework_router.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:meta/meta.dart'; @visibleForTesting @@ -23,15 +23,10 @@ void setupUITest({ ); } -class _UITestConfig { - _UITestConfig({ - required this.context, - required this.router, - }); - - final ProvidersContext context; - final AppRouter router; -} +class _UITestConfig({ + required final ProvidersContext context, + required final AppRouter router, +}); /// Can be used to wrap the test widget with other widgets. /// diff --git a/packages/clean_framework_test/lib/src/ui_test.dart b/packages/clean_framework_test/lib/src/ui_test.dart index c50f2339..3e9bb66f 100644 --- a/packages/clean_framework_test/lib/src/ui_test.dart +++ b/packages/clean_framework_test/lib/src/ui_test.dart @@ -3,9 +3,9 @@ import 'dart:async'; import 'package:clean_framework/clean_framework.dart'; import 'package:clean_framework_router/clean_framework_router.dart'; import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; import 'package:flutter_riverpod/misc.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'package:material_ui/material_ui.dart'; import 'package:meta/meta.dart'; enum UITestRouteAction { diff --git a/packages/clean_framework_test/lib/src/use_case_fake.dart b/packages/clean_framework_test/lib/src/use_case_fake.dart index 6e20acf1..15629eaf 100644 --- a/packages/clean_framework_test/lib/src/use_case_fake.dart +++ b/packages/clean_framework_test/lib/src/use_case_fake.dart @@ -7,14 +7,12 @@ typedef UseCaseSubscription DomainModel, ); -class UseCaseFake extends Fake - implements UseCase { - UseCaseFake({this.domainModel}); - +class UseCaseFake({ + final DomainModel? domainModel, +}) extends Fake implements UseCase { EntityFake _entity = const EntityFake(); late RequestSubscription subscription; S? successInput; - final DomainModel? domainModel; @override EntityFake get entity => _entity; @@ -54,11 +52,7 @@ class UseCaseFake extends Fake } } -class EntityFake extends Entity { - const EntityFake({this.value = 'initial'}); - - final String value; - +class const EntityFake({final String value = 'initial'}) extends Entity { @override List get props => [value]; diff --git a/packages/clean_framework_test/pubspec.yaml b/packages/clean_framework_test/pubspec.yaml index 0f565585..7131b79d 100644 --- a/packages/clean_framework_test/pubspec.yaml +++ b/packages/clean_framework_test/pubspec.yaml @@ -1,27 +1,28 @@ name: clean_framework_test description: A collection test helpers to support clean_framework. -version: 0.5.4 +version: 0.5.5 homepage: https://acmesoftware.com/ repository: https://github.com/AcmeSoftwareLLC/clean_framework/packages/clean_framework_test environment: - sdk: '>=3.8.0 <4.0.0' - flutter: '>=3.32.0' + sdk: ">=3.13.0 <4.0.0" + flutter: ">=3.47.0" resolution: workspace dependencies: - clean_framework: ^4.1.3 - clean_framework_router: ^0.5.13 + clean_framework: ^4.1.4 + clean_framework_router: ^0.5.14 diff_match_patch: ^0.4.1 flutter: sdk: flutter - flutter_riverpod: ^3.1.0 + flutter_riverpod: ^3.4.2 flutter_test: sdk: flutter + material_ui: ^1.1.0 meta: '>=1.8.0 <2.0.0' - mocktail: ^1.0.4 + mocktail: ^1.0.5 dev_dependencies: - very_good_analysis: ^10.0.0 + very_good_analysis: ^10.3.0 diff --git a/pubspec.yaml b/pubspec.yaml index 380b17e7..7b6fec69 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: clean_framework_workspace publish_to: none environment: - sdk: '>=3.8.0 <4.0.0' + sdk: '>=3.13.0 <4.0.0' workspace: - packages/clean_framework @@ -16,15 +16,15 @@ workspace: - packages/clean_framework_test dev_dependencies: - melos: ^7.3.0 - very_good_analysis: ^10.0.0 + melos: ^8.6.0 + very_good_analysis: ^10.3.0 melos: command: bootstrap: environment: - sdk: '>=3.8.0 <4.0.0' - flutter: '>=3.32.0' + sdk: '>=3.13.0 <4.0.0' + flutter: '>=3.47.0' scripts: analyze: