diff --git a/integration_test/search_test.dart b/integration_test/search_test.dart index 75b55ec..3d5ce15 100644 --- a/integration_test/search_test.dart +++ b/integration_test/search_test.dart @@ -11,8 +11,8 @@ import 'package:http_mock_adapter/http_mock_adapter.dart'; import 'data/api_data.dart'; void main() { - final dioAdapter = DioAdapter(); final dio = Dio(); + final dioAdapter = DioAdapter(dio: dio); setUpAll(() { dio.httpClientAdapter = dioAdapter; diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 6b4c0f7..f2872cf 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 8.0 + 9.0 diff --git a/ios/Podfile.lock b/ios/Podfile.lock index ec2e8c3..468d9fb 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -24,9 +24,9 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/shared_preferences/ios" SPEC CHECKSUMS: - Flutter: 434fef37c0980e73bb6479ef766c45957d4b510c + Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a flutter_secure_storage: 7953c38a04c3fdbb00571bcd87d8e3b5ceb9daec - integration_test: 6eb66a19f7104200dcfdd62bc0077e1b09686e4f + integration_test: 7db6d89f336f671dcbc7563ee27a5b08f6f8aee1 shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c diff --git a/lib/constants/app_theme.dart b/lib/constants/app_theme.dart index 4334fb8..694be2a 100644 --- a/lib/constants/app_theme.dart +++ b/lib/constants/app_theme.dart @@ -9,15 +9,11 @@ class AppTheme { unselectedItemColor: Colors.white70), appBarTheme: AppBarTheme( color: Colors.blueGrey, - brightness: Brightness.dark, ), scaffoldBackgroundColor: Colors.white, - accentColor: Colors.black54, - brightness: Brightness.light, cardColor: Colors.grey[500], unselectedWidgetColor: Colors.black45, focusColor: Colors.black, - primarySwatch: Colors.blueGrey, textTheme: TextTheme( headline1: TextStyle( color: Colors.black, fontSize: 40, fontWeight: FontWeight.w500), @@ -36,6 +32,8 @@ class AppTheme { subtitle2: TextStyle( color: Colors.black, fontSize: 16, fontWeight: FontWeight.bold), ), + colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.blueGrey) + .copyWith(secondary: Colors.black54), ); static final ThemeData dark = ThemeData( @@ -46,13 +44,9 @@ class AppTheme { unselectedItemColor: Colors.white70), appBarTheme: AppBarTheme( color: Colors.black, - brightness: Brightness.dark, ), scaffoldBackgroundColor: Colors.black, - accentColor: Colors.white54, - brightness: Brightness.dark, focusColor: Colors.white, - primarySwatch: Colors.blueGrey, textTheme: TextTheme( headline1: TextStyle( color: Colors.white, fontSize: 40, fontWeight: FontWeight.w500), @@ -70,5 +64,7 @@ class AppTheme { color: Colors.white70, fontSize: 14, fontWeight: FontWeight.normal), subtitle2: TextStyle( color: Colors.white, fontSize: 16, fontWeight: FontWeight.bold)), + colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.blueGrey) + .copyWith(secondary: Colors.white54), ); } diff --git a/lib/main.dart b/lib/main.dart index 6647061..154ddeb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,7 +1,6 @@ import 'package:cryptocurrency_app/constants/app_theme.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'provider/settings_provider.dart'; @@ -20,12 +19,12 @@ void main() async { child: ProviderScope(child: MyApp()))); } -class MyApp extends HookWidget { +class MyApp extends HookConsumerWidget { MyApp({Key? key}) : super(key: key); @override - Widget build(BuildContext context) { - final settings = useProvider(cryptoSettings); + Widget build(BuildContext context, WidgetRef ref) { + final settings = ref.watch(cryptoSettings); final themeMode = settings.maybeWhen( data: (data) => Utils.getThemeMode(data.themeMode), diff --git a/lib/ui/home.dart b/lib/ui/home.dart index 78855de..d86c9a8 100644 --- a/lib/ui/home.dart +++ b/lib/ui/home.dart @@ -4,17 +4,16 @@ import 'package:cryptocurrency_app/ui/screens/home.dart'; import 'package:cryptocurrency_app/ui/screens/search.dart'; import 'package:cryptocurrency_app/ui/screens/settings.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:easy_localization/easy_localization.dart'; import '../generated/locale_keys.g.dart'; -class Home extends HookWidget { +class Home extends HookConsumerWidget { const Home({Key? key}) : super(key: key); @override - Widget build(BuildContext context) { - final navigation = useProvider(navigationProvider); + Widget build(BuildContext context, WidgetRef ref) { + final navigation = ref.watch(navigationProvider); return Scaffold( body: currentScreen(navigation.index), @@ -22,7 +21,7 @@ class Home extends HookWidget { key: Keys.NAV_BAR, currentIndex: navigation.index, onTap: (index) { - context.read(navigationProvider.notifier).selectPage(index); + ref.read(navigationProvider.notifier).selectPage(index); }, items: [ BottomNavigationBarItem( diff --git a/lib/ui/screens/details.dart b/lib/ui/screens/details.dart index 64cc9ce..09e883b 100644 --- a/lib/ui/screens/details.dart +++ b/lib/ui/screens/details.dart @@ -7,16 +7,15 @@ import 'package:cryptocurrency_app/ui/widgets/details/time_bar_selector.dart'; import 'package:cryptocurrency_app/ui/widgets/line_chart.dart'; import 'package:cryptocurrency_app/ui/widgets/title_price.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -class DetailsScreen extends HookWidget { +class DetailsScreen extends HookConsumerWidget { final Pair pair; DetailsScreen({required this.pair}); @override - Widget build(BuildContext context) { - final graph = useProvider(graphDataProvider(pair)); + Widget build(BuildContext context, WidgetRef ref) { + final graph = ref.watch(graphDataProvider(pair)); return Scaffold( key: Keys.DETAILS_SCREEN, diff --git a/lib/ui/screens/home.dart b/lib/ui/screens/home.dart index d761929..433f367 100644 --- a/lib/ui/screens/home.dart +++ b/lib/ui/screens/home.dart @@ -4,16 +4,15 @@ import 'package:cryptocurrency_app/ui/widgets/favorite_pair.dart'; import 'package:cryptocurrency_app/ui/widgets/pair_tile.dart'; import 'package:flutter/material.dart'; import 'package:flutter/src/widgets/framework.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:easy_localization/easy_localization.dart'; import '../../generated/locale_keys.g.dart'; -class HomeScreen extends HookWidget { +class HomeScreen extends HookConsumerWidget { @override - Widget build(BuildContext context) { - final pairs = useProvider(pairsProvider); - final favoritePair = useProvider(favoritePairProvider); + Widget build(BuildContext context, WidgetRef ref) { + final pairs = ref.watch(pairsProvider); + final favoritePair = ref.watch(favoritePairProvider); return Container( key: Keys.HOME_SCREEN, child: Column( diff --git a/lib/ui/screens/search.dart b/lib/ui/screens/search.dart index 5ebc4d0..31a1bbc 100644 --- a/lib/ui/screens/search.dart +++ b/lib/ui/screens/search.dart @@ -2,15 +2,14 @@ import 'package:cryptocurrency_app/constants/keys.dart'; import 'package:cryptocurrency_app/provider/crypto_provider.dart'; import 'package:cryptocurrency_app/ui/widgets/pair_tile.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:easy_localization/easy_localization.dart'; import '../../generated/locale_keys.g.dart'; -class SearchScreen extends HookWidget { +class SearchScreen extends HookConsumerWidget { @override - Widget build(BuildContext context) { - final pairs = useProvider(pairsSearchProvider); + Widget build(BuildContext context, WidgetRef ref) { + final pairs = ref.watch(pairsSearchProvider); return Container( key: Keys.SEARCH_SCREEN, @@ -31,7 +30,7 @@ class SearchScreen extends HookWidget { ), child: TextFormField( key: Keys.SEARCH_TEXT_FIELD, - initialValue: context.read(searchTextProvider).state, + initialValue: ref.read(searchTextProvider).state, style: TextStyle(color: Colors.white, fontSize: 21), decoration: new InputDecoration( prefixIcon: new Icon(Icons.search, @@ -40,7 +39,7 @@ class SearchScreen extends HookWidget { hintStyle: new TextStyle(color: Colors.white), border: InputBorder.none), onChanged: (value) => - {context.read(searchTextProvider).state = value}, + {ref.read(searchTextProvider).state = value}, ), ), Expanded( diff --git a/lib/ui/screens/settings.dart b/lib/ui/screens/settings.dart index 1fe8a86..eea1fb8 100644 --- a/lib/ui/screens/settings.dart +++ b/lib/ui/screens/settings.dart @@ -4,19 +4,19 @@ import 'package:cryptocurrency_app/models/markets/pair/pair.dart'; import 'package:cryptocurrency_app/provider/crypto_provider.dart'; import 'package:cryptocurrency_app/provider/settings_provider.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:settings_ui/settings_ui.dart'; import '../../generated/locale_keys.g.dart'; import 'package:cryptocurrency_app/constants/utils.dart' as Utils; +import 'package:flutter_riverpod/flutter_riverpod.dart'; -class SettingScreen extends HookWidget { +class SettingScreen extends HookConsumerWidget { @override - Widget build(BuildContext context) { - final settings = useProvider(cryptoSettings); - final exchanges = useProvider(exchangesProvider); - final pairs = useProvider(pairsProvider); + Widget build(BuildContext context, WidgetRef ref) { + final settings = ref.watch(cryptoSettings); + final exchanges = ref.watch(exchangesProvider); + final pairs = ref.watch(pairsProvider); final details = settings.maybeWhen(data: (details) => details, orElse: () => null); @@ -44,7 +44,7 @@ class SettingScreen extends HookWidget { leading: Icon(Icons.language), onPressed: (BuildContext ctx) => showLenguageSelectionDialog( - context, details.currentLanguage)), + context, ref, details.currentLanguage)), ], ), SettingsSection( @@ -55,14 +55,15 @@ class SettingScreen extends HookWidget { subtitle: details.favoriteExchange, leading: Icon(Icons.graphic_eq), onPressed: (BuildContext context) => - showExchangeSelectDialog(context, exchanges), + showExchangeSelectDialog( + context, ref, exchanges), ), SettingsTile( title: LocaleKeys.topPair.tr(), subtitle: details.favoritePair, leading: Icon(Icons.language), onPressed: (BuildContext context) => - showTopPairSelectDialog(context, pairs)), + showTopPairSelectDialog(context, ref, pairs)), ], ), SettingsSection( @@ -74,7 +75,7 @@ class SettingScreen extends HookWidget { leading: Icon(Icons.graphic_eq), onPressed: (BuildContext context) => showThemeSelectDialog( - context, details.themeMode), + context, ref, details.themeMode), ), ], ), @@ -88,7 +89,7 @@ class SettingScreen extends HookWidget { } void showLenguageSelectionDialog( - BuildContext context, String currentLenguage) { + BuildContext context, WidgetRef ref, String currentLenguage) { showDialog( context: context, builder: (_) => AlertDialog( @@ -105,7 +106,7 @@ class SettingScreen extends HookWidget { onChanged: (value) async { await context.setLocale(Locale('en')); - context + ref .read(cryptoSettings.notifier) .setLenguage(LocaleKeys.english); @@ -125,7 +126,7 @@ class SettingScreen extends HookWidget { groupValue: LocaleKeys.spanish, onChanged: (value) async { await context.setLocale(Locale('es')); - context + ref .read(cryptoSettings.notifier) .setLenguage(LocaleKeys.spanish); Navigator.pop(context); @@ -144,8 +145,8 @@ class SettingScreen extends HookWidget { ); } - void showExchangeSelectDialog( - BuildContext context, AsyncValue> exchanges) { + void showExchangeSelectDialog(BuildContext context, WidgetRef ref, + AsyncValue> exchanges) { showDialog( context: context, builder: (context) { @@ -159,7 +160,7 @@ class SettingScreen extends HookWidget { itemBuilder: (context, index) { return GestureDetector( onTap: () { - context + ref .read(cryptoSettings.notifier) .setFavoriteExchange(data[index].symbol); @@ -182,7 +183,7 @@ class SettingScreen extends HookWidget { } void showTopPairSelectDialog( - BuildContext context, AsyncValue> pairs) { + BuildContext context, WidgetRef ref, AsyncValue> pairs) { showDialog( context: context, builder: (context) { @@ -200,7 +201,7 @@ class SettingScreen extends HookWidget { children: [ GestureDetector( onTap: () { - context + ref .read(cryptoSettings.notifier) .setFavoritePair(data[index].pair); Navigator.pop(context); @@ -224,7 +225,8 @@ class SettingScreen extends HookWidget { }); } - void showThemeSelectDialog(BuildContext context, currentTheme) { + void showThemeSelectDialog( + BuildContext context, WidgetRef ref, currentTheme) { showDialog( context: context, builder: (context) { @@ -235,16 +237,14 @@ class SettingScreen extends HookWidget { children: Utils.themeModes .map((data) => GestureDetector( onTap: () { - context - .read(cryptoSettings.notifier) - .setTheme(data); + ref.read(cryptoSettings.notifier).setTheme(data); Navigator.pop(context); }, child: Row( children: [ Radio( onChanged: (value) { - context + ref .read(cryptoSettings.notifier) .setTheme(value!); Navigator.pop(context); diff --git a/lib/ui/widgets/details/details_widget.dart b/lib/ui/widgets/details/details_widget.dart index f906759..fa9d038 100644 --- a/lib/ui/widgets/details/details_widget.dart +++ b/lib/ui/widgets/details/details_widget.dart @@ -11,17 +11,17 @@ import 'ohlc_section.dart'; import 'order_book_section.dart'; import 'trades_section.dart'; -class DetailsWidget extends HookWidget { +class DetailsWidget extends HookConsumerWidget { final Pair pair; const DetailsWidget({Key? key, required this.pair}) : super(key: key); @override - Widget build(BuildContext context) { + Widget build(BuildContext context, WidgetRef ref) { final _controller = useTabController(initialLength: 4); - final graph = useProvider(graphDataProvider(pair)); - final summary = useProvider(pairSummaryProvider(pair)); - final orderBook = useProvider(pairOrderBookProvider(pair)); - final trades = useProvider(tradesProvider(pair)); + final graph = ref.watch(graphDataProvider(pair)); + final summary = ref.watch(pairSummaryProvider(pair)); + final orderBook = ref.watch(pairOrderBookProvider(pair)); + final trades = ref.watch(tradesProvider(pair)); return Container( child: Column( diff --git a/lib/ui/widgets/details/time_bar_selector.dart b/lib/ui/widgets/details/time_bar_selector.dart index 5f5bc10..3ef8d5c 100644 --- a/lib/ui/widgets/details/time_bar_selector.dart +++ b/lib/ui/widgets/details/time_bar_selector.dart @@ -1,13 +1,12 @@ import 'package:cryptocurrency_app/provider/time_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/src/widgets/framework.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -class TimeBarSelector extends HookWidget { +class TimeBarSelector extends HookConsumerWidget { @override - Widget build(BuildContext context) { - final time = useProvider(timeDataProvider); + Widget build(BuildContext context, WidgetRef ref) { + final time = ref.watch(timeDataProvider); return Container( padding: EdgeInsets.symmetric(horizontal: 15), diff --git a/lib/ui/widgets/pair_tile.dart b/lib/ui/widgets/pair_tile.dart index 97e47a8..07f69c9 100644 --- a/lib/ui/widgets/pair_tile.dart +++ b/lib/ui/widgets/pair_tile.dart @@ -4,23 +4,22 @@ import 'package:cryptocurrency_app/models/markets/pair/pair.dart'; import 'package:cryptocurrency_app/provider/crypto_provider.dart'; import 'package:cryptocurrency_app/ui/screens/details.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:cryptocurrency_app/constants/utils.dart' as Utils; import 'line_chart.dart'; -final currentPair = ScopedProvider(null); +final currentPair = Provider((ref) => Pair(exchange: "", pair: "")); -class PairTile extends HookWidget { +class PairTile extends HookConsumerWidget { const PairTile(); @override - Widget build(BuildContext context) { - final pair = useProvider(currentPair); - final summary = useProvider(pairSummaryProvider(pair)); - final graph = useProvider(graphDataProvider(pair)); + Widget build(BuildContext context, WidgetRef ref) { + final pair = ref.watch(currentPair); + final summary = ref.watch(pairSummaryProvider(pair)); + final graph = ref.watch(graphDataProvider(pair)); return Container( key: Keys.PAIR_TILE, diff --git a/lib/ui/widgets/title_price.dart b/lib/ui/widgets/title_price.dart index 973b3f3..0a0d1d4 100644 --- a/lib/ui/widgets/title_price.dart +++ b/lib/ui/widgets/title_price.dart @@ -3,18 +3,17 @@ import 'package:cryptocurrency_app/models/markets/pair/pair.dart'; import 'package:cryptocurrency_app/provider/crypto_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/src/widgets/framework.dart'; -import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:easy_localization/easy_localization.dart'; -class TitlePrice extends HookWidget { +class TitlePrice extends HookConsumerWidget { final Pair pair; TitlePrice({required this.pair}); @override - Widget build(BuildContext context) { - final data = useProvider(pairSummaryProvider(pair)); + Widget build(BuildContext context, WidgetRef ref) { + final data = ref.watch(pairSummaryProvider(pair)); return data.when( data: (data) { diff --git a/pubspec.lock b/pubspec.lock index 3649ef8..6343ab6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -273,7 +273,7 @@ packages: source: sdk version: "0.0.0" flutter_hooks: - dependency: "direct main" + dependency: transitive description: name: flutter_hooks url: "https://pub.dartlang.org" @@ -299,12 +299,12 @@ packages: source: hosted version: "1.2.0" flutter_riverpod: - dependency: transitive + dependency: "direct main" description: name: flutter_riverpod url: "https://pub.dartlang.org" source: hosted - version: "0.12.4" + version: "1.0.0-dev.6" flutter_secure_storage: dependency: "direct main" description: @@ -368,7 +368,7 @@ packages: name: hooks_riverpod url: "https://pub.dartlang.org" source: hosted - version: "0.12.4" + version: "1.0.0-dev.6" http_mock_adapter: dependency: "direct dev" description: @@ -569,7 +569,7 @@ packages: name: riverpod url: "https://pub.dartlang.org" source: hosted - version: "0.12.4" + version: "1.0.0-dev.6" settings_ui: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 8c8714a..5194442 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,33 +19,33 @@ version: 1.0.0+1 environment: sdk: '>=2.12.0 <3.0.0' - + dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.0 - flutter_hooks: - hooks_riverpod: + hooks_riverpod: 1.0.0-dev.6 + flutter_riverpod: 1.0.0-dev.6 dio: ^4.0.0 flutter_dotenv: ^5.0.0 - fl_chart: ^0.36.1 + fl_chart: ^0.36.1 settings_ui: ^1.0.0 auto_size_text: ^3.0.0-nullsafety.0 - flutter_secure_storage: ^4.1.0 + flutter_secure_storage: ^4.1.0 easy_localization: ^3.0.0 freezed_annotation: flutter_candlesticks: git: https://github.com/salvadordeveloper/flutter-candlesticks.git mockito: ^5.0.9 - + dev_dependencies: integration_test: sdk: flutter flutter_test: sdk: flutter http_mock_adapter: ^0.3.2 - build_runner: - freezed: + build_runner: + freezed: json_serializable: flutter_launcher_icons: ^0.9.0 flutter_native_splash: ^1.1.8+4