diff --git a/android/gradle.properties b/android/gradle.properties index 79b0a521ccefab573594bb786103d6e5fc762883..7aef769d163302288fe58ec83e6b4f3d21afd030 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true -app.versionName=1.0.35 -app.versionCode=36 +app.versionName=1.0.36 +app.versionCode=37 diff --git a/lib/cubit/data_cubit.dart b/lib/cubit/data_cubit.dart index 05335fb9762255ef65e22dda15880eca384d2de4..262453a59ed5d2823c3bdabd0cbd679b054ef708 100644 --- a/lib/cubit/data_cubit.dart +++ b/lib/cubit/data_cubit.dart @@ -11,6 +11,10 @@ class DataCubit extends HydratedCubit<DataState> { emit(state); } + void updateCounter(int delta) { + emit(DataState(counter: (state.counter ?? 0) + delta)); + } + @override DataState? fromJson(Map<String, dynamic> json) { int counter = json['counter'] as int; diff --git a/lib/main.dart b/lib/main.dart index f05fb0c5777f9479dbbbc7920f3a016f4ebeff4e..1a3b173e360e25bcfe6b0e4d852092df8cfe0154 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,11 +2,15 @@ import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hive/hive.dart'; import 'package:hydrated_bloc/hydrated_bloc.dart'; import 'package:path_provider/path_provider.dart'; import 'package:random/config/theme.dart'; +import 'package:random/cubit/bottom_nav_cubit.dart'; +import 'package:random/cubit/data_cubit.dart'; +import 'package:random/cubit/settings_cubit.dart'; import 'package:random/ui/skeleton.dart'; void main() async { @@ -38,14 +42,21 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { - return MaterialApp( - title: 'Random application', - theme: appTheme, - home: SkeletonScreen(), - localizationsDelegates: context.localizationDelegates, - supportedLocales: context.supportedLocales, - locale: context.locale, - debugShowCheckedModeBanner: false, + return MultiBlocProvider( + providers: [ + BlocProvider<SettingsCubit>(create: (context) => SettingsCubit()), + BlocProvider<BottomNavCubit>(create: (context) => BottomNavCubit()), + BlocProvider<DataCubit>(create: (context) => DataCubit()), + ], + child: MaterialApp( + title: 'Random application', + theme: appTheme, + home: SkeletonScreen(), + localizationsDelegates: context.localizationDelegates, + supportedLocales: context.supportedLocales, + locale: context.locale, + debugShowCheckedModeBanner: false, + ), ); } } diff --git a/lib/ui/screens/demo_page.dart b/lib/ui/screens/demo_page.dart index 03afe0a3f5d6d70445e6a03c2146dc35e2591652..8d10142d6697bbdcdfdd5b340058558c9e0700c4 100644 --- a/lib/ui/screens/demo_page.dart +++ b/lib/ui/screens/demo_page.dart @@ -21,7 +21,10 @@ class DemoPage extends StatelessWidget { SizedBox(height: 8), AppHeader(text: 'TOP'), SizedBox(height: 20), - persistedCounterBlock(), + persistedCounterBlock(BlocProvider.of<DataCubit>(context)), + SizedBox(height: 20), + testBlocConsumer(), + testBlocBuilder(), SizedBox(height: 20), fakeApiCall(), SizedBox(height: 20), @@ -31,61 +34,68 @@ class DemoPage extends StatelessWidget { ); } - Widget persistedCounterBlock() { - return BlocProvider<DataCubit>( - create: (BuildContext context) => DataCubit(), - child: BlocBuilder<DataCubit, DataState>( - builder: (BuildContext context, DataState state) { - void updateCounter(int delta) { - BlocProvider.of<DataCubit>(context).getData( - DataState(counter: (state.counter ?? 0) + delta), - ); - } - - return Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - IconButton( - icon: Icon(UniconsSolid.arrow_circle_down), - color: appTheme.primaryColor, - onPressed: () => updateCounter(-1), - ), - Padding( - padding: EdgeInsets.all(10), - child: Text(state.counter.toString()), - ), - IconButton( - icon: Icon(UniconsSolid.arrow_circle_up), - color: appTheme.primaryColor, - onPressed: () => updateCounter(1), - ), - ], - ); - }, - ), + Widget persistedCounterBlock(DataCubit dataCubit) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + IconButton( + icon: Icon(UniconsSolid.arrow_circle_down), + color: appTheme.primaryColor, + onPressed: () => dataCubit.updateCounter(-1), + ), + testBlocConsumer(), + IconButton( + icon: Icon(UniconsSolid.arrow_circle_up), + color: appTheme.primaryColor, + onPressed: () => dataCubit.updateCounter(1), + ), + ], ); } Widget fakeApiCall() { - return BlocProvider<SettingsCubit>( - create: (BuildContext context) => SettingsCubit(), - child: BlocBuilder<SettingsCubit, SettingsState>( - builder: (BuildContext context, SettingsState state) { - SettingsCubit settings = BlocProvider.of<SettingsCubit>(context); + return BlocBuilder<SettingsCubit, SettingsState>( + builder: (context, settingsSate) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Text('apiUrl: ' + settingsSate.apiUrl.toString()), + Text('securityToken: ' + (settingsSate.securityToken.toString())), + Text('interfaceType: ' + settingsSate.interfaceType.toString()), + ], + ); + }, + ); + } - return Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text('apiUrl: ' + settings.getApiUrl()), - Text('securityToken: ' + settings.getSecurityToken()), - Text('interfaceType: ' + settings.getInterfaceType().toString()), - Text('unknown: ' + settings.getSetting('unknown', 'undefined').toString()), - ], - ); - }, - ), + Widget testBlocConsumer() { + return BlocConsumer<DataCubit, DataState>( + listener: (context, dataState) { + // do stuff here based on state + }, + builder: (context, dataState) { + // return widget here based on state + return Text('BlocConsumer / ' + dataState.toString()); + }, + ); + } + + Widget testBlocListener() { + return BlocListener<DataCubit, DataState>( + listener: (context, dataState) { + // do stuff here based on state + }, + ); + } + + Widget testBlocBuilder() { + return BlocBuilder<DataCubit, DataState>( + builder: (context, dataState) { + // return widget here based on state + return Text('BlocBuilder / ' + dataState.toString()); + }, ); } } diff --git a/lib/ui/skeleton.dart b/lib/ui/skeleton.dart index 0f016729734e52cddb7c280e65a53d20b3096f3b..6492f6af94936851d4b0168ff4aa1b441c091872 100644 --- a/lib/ui/skeleton.dart +++ b/lib/ui/skeleton.dart @@ -3,7 +3,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_swipe/flutter_swipe.dart'; import 'package:random/cubit/bottom_nav_cubit.dart'; -import 'package:random/cubit/settings_cubit.dart'; import 'package:random/ui/screens/about_page.dart'; import 'package:random/ui/screens/demo_page.dart'; import 'package:random/ui/screens/graph_page.dart'; @@ -21,8 +20,6 @@ class SkeletonScreen extends StatefulWidget { class _SkeletonScreenState extends State<SkeletonScreen> { @override Widget build(BuildContext context) { - print('SkeletonScreen - build'); - const List<Widget> pageNavigation = <Widget>[ DemoPage(), GraphPage(), @@ -30,41 +27,28 @@ class _SkeletonScreenState extends State<SkeletonScreen> { AboutPage(), ]; - return BlocProvider<SettingsCubit>( - create: (BuildContext context) => SettingsCubit(), - child: BlocProvider<BottomNavCubit>( - create: (BuildContext context) => BottomNavCubit(), - child: BlocBuilder<BottomNavCubit, int>( - builder: (BuildContext context, int state) { - return Scaffold( - extendBodyBehindAppBar: false, - appBar: StandardAppBar(), - body: Swiper( - itemCount: BlocProvider.of<BottomNavCubit>(context).pagesCount, - itemBuilder: (BuildContext context, int index) { - return AnimatedSwitcher( - duration: const Duration(milliseconds: 300), - child: pageNavigation.elementAt(index), - ); - }, - pagination: SwiperPagination( - builder: SwiperCustomPagination( - builder: (BuildContext context, SwiperPluginConfig config) { - return BottomNavBar(swipeController: config.controller); - }, - ), - ), - onIndexChanged: (newPageIndex) { - BlocProvider.of<BottomNavCubit>(context).updateIndex(newPageIndex); - }, - outer: true, - loop: false, - ), - backgroundColor: Theme.of(context).colorScheme.background, - ); - }, + return Scaffold( + extendBodyBehindAppBar: false, + appBar: StandardAppBar(), + body: Swiper( + itemCount: BlocProvider.of<BottomNavCubit>(context).pagesCount, + itemBuilder: (BuildContext context, int index) { + return pageNavigation.elementAt(index); + }, + pagination: SwiperPagination( + builder: SwiperCustomPagination( + builder: (BuildContext context, SwiperPluginConfig config) { + return BottomNavBar(swipeController: config.controller); + }, + ), ), + onIndexChanged: (newPageIndex) { + BlocProvider.of<BottomNavCubit>(context).updateIndex(newPageIndex); + }, + outer: true, + loop: false, ), + backgroundColor: Theme.of(context).colorScheme.background, ); } } diff --git a/lib/ui/widgets/app_bar.dart b/lib/ui/widgets/app_bar.dart index 3afc4bbd82ba83a7bdac0389bb09df1b38d21189..648a641a98f807b8651688bee2de8017a71c669a 100644 --- a/lib/ui/widgets/app_bar.dart +++ b/lib/ui/widgets/app_bar.dart @@ -7,8 +7,6 @@ class StandardAppBar extends StatelessWidget implements PreferredSizeWidget { @override Widget build(BuildContext context) { - print('StandardAppBar - build'); - return AppBar( title: AppHeader(text: 'app_name'), actions: [ diff --git a/lib/ui/widgets/header_app.dart b/lib/ui/widgets/header_app.dart index a64053e888c4d94319343a8b9192619dfbf13d5f..af80150eeac8fa18482af7b2bbeefe37fb54326d 100644 --- a/lib/ui/widgets/header_app.dart +++ b/lib/ui/widgets/header_app.dart @@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:random/cubit/data_cubit.dart'; import 'package:random/cubit/settings_cubit.dart'; import 'package:random/models/interface_type.dart'; @@ -12,24 +13,38 @@ class AppHeader extends StatelessWidget { @override Widget build(BuildContext context) { - print('AppHeader - build (' + this.text + ')'); + return Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + tr(text), + textAlign: TextAlign.start, + style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2), + ), + SizedBox(width: 2), + expertInterfaceIndicator(), + SizedBox(width: 2), + dataCounterIndicator(), + ], + ); + } - return BlocProvider<SettingsCubit>( - create: (BuildContext context) => SettingsCubit(), - child: BlocBuilder<SettingsCubit, SettingsState>( - builder: (BuildContext context, SettingsState state) { - SettingsCubit settings = BlocProvider.of<SettingsCubit>(context); + Widget expertInterfaceIndicator() { + return BlocBuilder<SettingsCubit, SettingsState>( + builder: (BuildContext context, SettingsState settingsState) { + bool isExpert = settingsState.interfaceType == InterfaceType.expert; - bool isExpert = settings.getInterfaceType() == InterfaceType.expert; - String titleSuffix = isExpert ? ' ⭐' : ''; + return Text(isExpert ? '⭐' : ''); + }, + ); + } - return Text( - tr(text) + titleSuffix, - textAlign: TextAlign.start, - style: Theme.of(context).textTheme.headlineMedium!.apply(fontWeightDelta: 2), - ); - }, - ), + Widget dataCounterIndicator() { + return BlocBuilder<DataCubit, DataState>( + builder: (context, dataState) { + return Text('(' + dataState.counter.toString() + ')'); + }, ); } } diff --git a/pubspec.yaml b/pubspec.yaml index 7edccdd2e5f2cc5a2c75fab9be5961333205eb11..4e20996dfc1f224bada21a6f3daa4fd1f52aeae5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A random application, for testing purpose only. publish_to: 'none' -version: 1.0.35+36 +version: 1.0.36+37 environment: sdk: '^3.0.0'