From 82b91a78acb3345b497cfab15cf4d1eafef03f54 Mon Sep 17 00:00:00 2001 From: fidanci Date: Fri, 26 Mar 2021 15:59:36 +0300 Subject: [PATCH] Most bugs are resolved. --- lib/core/components/button/normal_button.dart | 19 ++- .../navigation/navigation_constants.dart | 2 +- lib/core/init/lang/language_manager.dart | 2 +- .../init/navigation/navigation_route.dart | 2 +- .../network/network_core/core_operations.dart | 2 +- lib/core/init/network/network_manager.dart | 9 +- lib/core/init/notifier/provider_list.dart | 2 +- .../init/theme/light/color_scheme_light.dart | 2 +- .../init/theme/light/text_theme_light.dart | 20 ++-- lib/core/init/theme/panache/red_theme.dart | 9 +- lib/product/widget/button/header_button.dart | 35 +++++- .../_widgets/button/login_button.dart | 2 +- .../_widgets/list-tile/friend_card.dart | 24 +++- .../authenticate/login/view/login_view.dart | 112 ++++++++++++++---- .../login/view/login_view_two.dart | 34 ++++-- .../authenticate/test/view/test_view.dart | 4 +- .../test/viewmodel/test_view_model.dart | 8 +- .../home/build/feed/model/house_model.dart | 7 +- .../home/build/feed/view/build_feed_view.dart | 61 +++++++--- .../game/view/subview/game_view_cards.dart | 9 +- lib/view/home/social/view/social_view.dart | 72 ++++++++--- .../social/viewmodel/social_view_model.dart | 1 - pubspec.lock | 54 ++++----- .../core/extension/string_extension_test.dart | 6 +- test/core/network/core_dio_mock.dart | 16 ++- test/core/network/core_dio_test.dart | 24 ++-- test/feature/feed/social_feed_test.dart | 2 +- test/feature/test/sample_view_test.dart | 5 +- 28 files changed, 387 insertions(+), 158 deletions(-) diff --git a/lib/core/components/button/normal_button.dart b/lib/core/components/button/normal_button.dart index f8ab3cd..9740523 100644 --- a/lib/core/components/button/normal_button.dart +++ b/lib/core/components/button/normal_button.dart @@ -8,11 +8,24 @@ class NormalButton extends StatelessWidget { const NormalButton({Key key, this.child, this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { - return RaisedButton( - padding: EdgeInsets.all(15), - elevation: 10, + return ElevatedButton( + style: ButtonStyle( + padding: MaterialStateProperty.all(EdgeInsets.all(15)), + elevation: MaterialStateProperty.all(10), + ), onPressed: onPressed, child: child, ); } } + + +/*BEFORE: Flutter 2.0 + + RaisedButton( + padding: EdgeInsets.all(15), + elevation: 10, + onPressed: onPressed, + child: child, + ); + */ \ No newline at end of file diff --git a/lib/core/constants/navigation/navigation_constants.dart b/lib/core/constants/navigation/navigation_constants.dart index 5b229bc..a38d80b 100644 --- a/lib/core/constants/navigation/navigation_constants.dart +++ b/lib/core/constants/navigation/navigation_constants.dart @@ -1,3 +1,3 @@ class NavigationConstants { - static const TEST_VIEW = "/test"; + static const TEST_VIEW = '/test'; } diff --git a/lib/core/init/lang/language_manager.dart b/lib/core/init/lang/language_manager.dart index 80aebf9..fb27e1b 100644 --- a/lib/core/init/lang/language_manager.dart +++ b/lib/core/init/lang/language_manager.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; class LanguageManager { static LanguageManager _instance; static LanguageManager get instance { - if (_instance == null) _instance = LanguageManager._init(); + _instance ??= LanguageManager._init(); return _instance; } diff --git a/lib/core/init/navigation/navigation_route.dart b/lib/core/init/navigation/navigation_route.dart index 28b00ac..51a1d51 100644 --- a/lib/core/init/navigation/navigation_route.dart +++ b/lib/core/init/navigation/navigation_route.dart @@ -6,7 +6,7 @@ import '../../components/card/not_found_navigation_widget.dart'; import '../../constants/navigation/navigation_constants.dart'; class NavigationRoute { - static NavigationRoute _instance = NavigationRoute._init(); + static final NavigationRoute _instance = NavigationRoute._init(); static NavigationRoute get instance => _instance; NavigationRoute._init(); diff --git a/lib/core/init/network/network_core/core_operations.dart b/lib/core/init/network/network_core/core_operations.dart index b0f7569..30e6e62 100644 --- a/lib/core/init/network/network_core/core_operations.dart +++ b/lib/core/init/network/network_core/core_operations.dart @@ -1,4 +1,4 @@ -part of "../core_dio.dart"; +part of '../core_dio.dart'; extension _CoreDioOperations on CoreDio { R _responseParser(BaseModel model, dynamic data) { diff --git a/lib/core/init/network/network_manager.dart b/lib/core/init/network/network_manager.dart index 133e963..a6ba7c6 100644 --- a/lib/core/init/network/network_manager.dart +++ b/lib/core/init/network/network_manager.dart @@ -8,15 +8,18 @@ import 'core_dio.dart'; class NetworkManager { static NetworkManager _instance; static NetworkManager get instance { - if (_instance == null) _instance = NetworkManager._init(); + _instance ??= NetworkManager._init(); return _instance; } ICoreDio coreDio; NetworkManager._init() { - final baseOptions = - BaseOptions(baseUrl: "https://jsonplaceholder.typicode.com/", headers: {"val": LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN)}); + final baseOptions = BaseOptions( + baseUrl: 'https://jsonplaceholder.typicode.com/', + headers: { + 'val': LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN) + }); // _dio = Dio(baseOptions); coreDio = CoreDio(baseOptions); diff --git a/lib/core/init/notifier/provider_list.dart b/lib/core/init/notifier/provider_list.dart index ab17802..f972e13 100644 --- a/lib/core/init/notifier/provider_list.dart +++ b/lib/core/init/notifier/provider_list.dart @@ -7,7 +7,7 @@ import 'theme_notifer.dart'; class ApplicationProvider { static ApplicationProvider _instance; static ApplicationProvider get instance { - if (_instance == null) _instance = ApplicationProvider._init(); + _instance ??= ApplicationProvider._init(); return _instance; } diff --git a/lib/core/init/theme/light/color_scheme_light.dart b/lib/core/init/theme/light/color_scheme_light.dart index 04e8404..26fe496 100644 --- a/lib/core/init/theme/light/color_scheme_light.dart +++ b/lib/core/init/theme/light/color_scheme_light.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; class ColorSchemeLight { static ColorSchemeLight _instace; static ColorSchemeLight get instance { - if (_instace == null) _instace = ColorSchemeLight._init(); + _instace ??= ColorSchemeLight._init(); return _instace; } diff --git a/lib/core/init/theme/light/text_theme_light.dart b/lib/core/init/theme/light/text_theme_light.dart index 174f047..f24e346 100644 --- a/lib/core/init/theme/light/text_theme_light.dart +++ b/lib/core/init/theme/light/text_theme_light.dart @@ -3,16 +3,22 @@ import 'package:flutter/material.dart'; class TextThemeLight { static TextThemeLight _instace; static TextThemeLight get instance { - if (_instace == null) _instace = TextThemeLight._init(); + _instace ??= TextThemeLight._init(); return _instace; } TextThemeLight._init(); - final TextStyle headline1 = TextStyle(fontSize: 96, fontWeight: FontWeight.w300, letterSpacing: -1.5); - final TextStyle headline2 = TextStyle(fontSize: 60, fontWeight: FontWeight.w300, letterSpacing: -0.5); - final TextStyle headline3 = TextStyle(fontSize: 48, fontWeight: FontWeight.w400); - final TextStyle headline4 = TextStyle(fontSize: 34, fontWeight: FontWeight.w400, letterSpacing: 0.25); - final TextStyle headline5 = TextStyle(fontSize: 24, fontWeight: FontWeight.w400); - final TextStyle overline = TextStyle(fontSize: 10, fontWeight: FontWeight.w400, letterSpacing: 1.5); + final TextStyle headline1 = + TextStyle(fontSize: 96, fontWeight: FontWeight.w300, letterSpacing: -1.5); + final TextStyle headline2 = + TextStyle(fontSize: 60, fontWeight: FontWeight.w300, letterSpacing: -0.5); + final TextStyle headline3 = + TextStyle(fontSize: 48, fontWeight: FontWeight.w400); + final TextStyle headline4 = + TextStyle(fontSize: 34, fontWeight: FontWeight.w400, letterSpacing: 0.25); + final TextStyle headline5 = + TextStyle(fontSize: 24, fontWeight: FontWeight.w400); + final TextStyle overline = + TextStyle(fontSize: 10, fontWeight: FontWeight.w400, letterSpacing: 1.5); } diff --git a/lib/core/init/theme/panache/red_theme.dart b/lib/core/init/theme/panache/red_theme.dart index 50f913e..f367abc 100644 --- a/lib/core/init/theme/panache/red_theme.dart +++ b/lib/core/init/theme/panache/red_theme.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -const String FONT_FAMILY = "Poppins"; +const String FONT_FAMILY = 'Poppins'; final ThemeData redTheme = ThemeData( fontFamily: FONT_FAMILY, @@ -31,8 +31,11 @@ final ThemeData redTheme = ThemeData( textSelectionHandleColor: Color(0xffe57373), backgroundColor: Color(0xffef9a9a), toggleButtonsTheme: ToggleButtonsThemeData( - fillColor: Color(0xffC20003), textStyle: TextStyle(color: Colors.white), selectedColor: Colors.white), - floatingActionButtonTheme: FloatingActionButtonThemeData(backgroundColor: Color(0xffC20003)), + fillColor: Color(0xffC20003), + textStyle: TextStyle(color: Colors.white), + selectedColor: Colors.white), + floatingActionButtonTheme: + FloatingActionButtonThemeData(backgroundColor: Color(0xffC20003)), dialogBackgroundColor: Color(0xffffffff), diff --git a/lib/product/widget/button/header_button.dart b/lib/product/widget/button/header_button.dart index bb3c31b..da0f049 100644 --- a/lib/product/widget/button/header_button.dart +++ b/lib/product/widget/button/header_button.dart @@ -8,7 +8,8 @@ class HeaderButton extends StatelessWidget { final String titleText; final VoidCallback onPressed; - const HeaderButton({Key key, this.titleText, this.onPressed}) : super(key: key); + const HeaderButton({Key key, this.titleText, this.onPressed}) + : super(key: key); @override Widget build(BuildContext context) { return Padding( @@ -23,12 +24,35 @@ class HeaderButton extends StatelessWidget { Text buildTextTitle(BuildContext context) { return Text( titleText.tr(), - style: context.textTheme.headline6.copyWith(color: context.colorScheme.onError), + style: context.textTheme.headline6 + .copyWith(color: context.colorScheme.onError), ); } - FlatButton buildFlatButtonRight(BuildContext context) { - return FlatButton( + TextButton buildFlatButtonRight(BuildContext context) { + return TextButton( + onPressed: () { + onPressed(); + }, + child: Wrap( + crossAxisAlignment: WrapCrossAlignment.center, + children: [ + Text(LocaleKeys.home_game_viewAll.tr(), + style: context.textTheme.subtitle2 + .copyWith(color: context.colorScheme.onError)), + Icon(Icons.arrow_right, color: context.colorScheme.onError) + ], + ), + style: ButtonStyle(padding: MaterialStateProperty.all(EdgeInsets.zero)), + ); + } +} + + +/* + +BEFORE: Flutter 2.0 +FlatButton( padding: EdgeInsets.zero, onPressed: () { onPressed(); @@ -40,5 +64,4 @@ class HeaderButton extends StatelessWidget { Icon(Icons.arrow_right, color: context.colorScheme.onError) ], )); - } -} + */ \ No newline at end of file diff --git a/lib/view/_product/_widgets/button/login_button.dart b/lib/view/_product/_widgets/button/login_button.dart index 76cf518..9bfaef9 100644 --- a/lib/view/_product/_widgets/button/login_button.dart +++ b/lib/view/_product/_widgets/button/login_button.dart @@ -11,7 +11,7 @@ class MVVMLoginButton extends StatelessWidget { return IconNormalButton( icon: Icons.access_alarm, onPressed: () { - onComplete("OKEY"); + onComplete('OKEY'); // BUSINESS CALL }, ); diff --git a/lib/view/_product/_widgets/list-tile/friend_card.dart b/lib/view/_product/_widgets/list-tile/friend_card.dart index 13dcb9e..61bca0f 100644 --- a/lib/view/_product/_widgets/list-tile/friend_card.dart +++ b/lib/view/_product/_widgets/list-tile/friend_card.dart @@ -17,13 +17,29 @@ class FriendCard extends StatelessWidget { title: Text(user.name), onTap: onPressed, subtitle: Text(user.company), - trailing: RaisedButton( + trailing: ElevatedButton( + onPressed: () {}, + child: Text(LocaleKeys.home_social_follow).tr(), + style: ButtonStyle( + padding: MaterialStateProperty.all(EdgeInsets.zero), + textStyle: MaterialStateProperty.all( + TextStyle(color: context.colorScheme.background)), + backgroundColor: MaterialStateProperty.all( + context.appTheme.buttonTheme.colorScheme.onError), + ), + ), + ); + } +} + + +/* BEFORE: Flutter 2.0 +RaisedButton ( child: Text(LocaleKeys.home_social_follow).tr(), onPressed: () {}, padding: EdgeInsets.zero, textColor: context.colorScheme.background, color: context.appTheme.buttonTheme.colorScheme.onError, ), - ); - } -} + + */ \ No newline at end of file diff --git a/lib/view/authenticate/login/view/login_view.dart b/lib/view/authenticate/login/view/login_view.dart index dd22591..cf72a3d 100644 --- a/lib/view/authenticate/login/view/login_view.dart +++ b/lib/view/authenticate/login/view/login_view.dart @@ -18,7 +18,8 @@ class LoginView extends StatelessWidget { model.setContext(context); model.init(); }, - onPageBuilder: (BuildContext context, LoginViewModel value) => DefaultTabController( + onPageBuilder: (BuildContext context, LoginViewModel value) => + DefaultTabController( length: 2, child: Scaffold( key: value.scaffoldState, @@ -27,7 +28,11 @@ class LoginView extends StatelessWidget { children: [ buildAnimatedContainer(context), buildContainerTabBar(context), - Expanded(flex: 6, child: Padding(padding: context.paddingNormal, child: buildForm(value, context))), + Expanded( + flex: 6, + child: Padding( + padding: context.paddingNormal, + child: buildForm(value, context))), ], ), ), @@ -39,16 +44,22 @@ class LoginView extends StatelessWidget { AnimatedContainer buildAnimatedContainer(BuildContext context) { return AnimatedContainer( duration: context.lowDuration, - height: context.mediaQuery.viewInsets.bottom > 0 ? 0 : context.height * 0.3, + height: + context.mediaQuery.viewInsets.bottom > 0 ? 0 : context.height * 0.3, color: Colors.white, child: Center(child: Image.asset(ImageConstants.instance.hotDog))); } Container buildContainerTabBar(BuildContext context) { return Container( - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.vertical(bottom: Radius.circular(50))), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.vertical(bottom: Radius.circular(50))), child: Padding( - padding: EdgeInsets.only(left: context.width * 0.1, right: context.width * 0.1, bottom: context.width * 0.01), + padding: EdgeInsets.only( + left: context.width * 0.1, + right: context.width * 0.1, + bottom: context.width * 0.01), child: buildTabBar(context), ), ); @@ -88,29 +99,50 @@ class LoginView extends StatelessWidget { ); } - Widget buildTextFormFieldPassword(BuildContext context, LoginViewModel viewModel) { + Widget buildTextFormFieldPassword( + BuildContext context, LoginViewModel viewModel) { return Observer(builder: (_) { return TextFormField( controller: viewModel.passwordController, validator: (value) => value.isNotEmpty ? null : 'This field required', obscureText: viewModel.isLockOpen, decoration: InputDecoration( - labelStyle: context.textTheme.subtitle1, - labelText: LocaleKeys.login_password.tr(), - icon: buildContainerIconField(context, Icons.vpn_key), - suffixIcon: FlatButton( - onPressed: () { - viewModel.isLockStateChange(); - }, - padding: EdgeInsets.zero, - child: Observer(builder: (_) { - return Icon(viewModel.isLockOpen ? Icons.lock : Icons.lock_open); - }))), + labelStyle: context.textTheme.subtitle1, + labelText: LocaleKeys.login_password.tr(), + icon: buildContainerIconField(context, Icons.vpn_key), + suffixIcon: TextButton( + onPressed: () { + viewModel.isLockStateChange(); + }, + child: Observer( + builder: (_) { + return Icon( + viewModel.isLockOpen ? Icons.lock : Icons.lock_open); + }, + ), + style: ButtonStyle( + padding: MaterialStateProperty.all(EdgeInsets.zero)), + ), + ), ); }); } - TextFormField buildTextFormFieldEmail(BuildContext context, LoginViewModel viewModel) { + /* BEFORE: Flutter 2.0 + + FlatButton( + onPressed: () { + viewModel.isLockStateChange(); + }, + padding: EdgeInsets.zero, + child: Observer(builder: (_) { + return Icon( + viewModel.isLockOpen ? Icons.lock : Icons.lock_open); + })), + */ + + TextFormField buildTextFormFieldEmail( + BuildContext context, LoginViewModel viewModel) { return TextFormField( controller: viewModel.emailController, validator: (value) => value.isValidEmails ? 'asdasd' : null, @@ -130,11 +162,35 @@ class LoginView extends StatelessWidget { ); } - Widget buildTextForgot() => Align(alignment: Alignment.centerRight, child: Text(LocaleKeys.login_forgotText, textAlign: TextAlign.end).tr()); + Widget buildTextForgot() => Align( + alignment: Alignment.centerRight, + child: Text(LocaleKeys.login_forgotText, textAlign: TextAlign.end).tr()); - Widget buildRaisedButtonLogin(BuildContext context, LoginViewModel viewModel) { + Widget buildRaisedButtonLogin( + BuildContext context, LoginViewModel viewModel) { return Observer(builder: (_) { - return RaisedButton( + return ElevatedButton( + onPressed: viewModel.isLoading + ? null + : () { + viewModel.fetchLoginSevice(); + }, + child: Center( + child: Text(LocaleKeys.login_login.tr(), + style: context.textTheme.headline5), + ), + style: ButtonStyle( + padding: MaterialStateProperty.all(context.paddingNormal), + shape: MaterialStateProperty.all(StadiumBorder()), + backgroundColor: MaterialStateProperty.all(context.colors.onError), + ), + ); + }); + } + +/* BEFORE: Flutter2.0 + +RaisedButton( padding: context.paddingNormal, onPressed: viewModel.isLoading ? null @@ -142,16 +198,22 @@ class LoginView extends StatelessWidget { viewModel.fetchLoginSevice(); }, shape: StadiumBorder(), - child: Center(child: Text(LocaleKeys.login_login.tr(), style: context.textTheme.headline5)), + child: Center( + child: Text(LocaleKeys.login_login.tr(), + style: context.textTheme.headline5)), color: context.colors.onError, ); - }); - } + + + */ Wrap buildWrapForgot() { return Wrap( crossAxisAlignment: WrapCrossAlignment.center, - children: [Text(LocaleKeys.login_dontAccount.tr()), FlatButton(onPressed: () {}, child: Text(LocaleKeys.login_tab2.tr()))], + children: [ + Text(LocaleKeys.login_dontAccount.tr()), + TextButton(onPressed: () {}, child: Text(LocaleKeys.login_tab2.tr())) + ], ); } } diff --git a/lib/view/authenticate/login/view/login_view_two.dart b/lib/view/authenticate/login/view/login_view_two.dart index 5d061be..a63df9a 100644 --- a/lib/view/authenticate/login/view/login_view_two.dart +++ b/lib/view/authenticate/login/view/login_view_two.dart @@ -14,18 +14,27 @@ class UserView extends StatelessWidget { height: MediaQuery.of(context).size.height * 0.4, child: Column( children: [ - Expanded(flex: 9, child: Container(color: Colors.red, child: FlutterLogo(size: 200))), + Expanded( + flex: 9, + child: Container( + color: Colors.red, child: FlutterLogo(size: 200))), Container( child: Padding( - padding: EdgeInsets.only(left: 30, right: 30, bottom: 5), - child: TabBar(indicatorSize: TabBarIndicatorSize.label, tabs: [ - Tab( - text: " Login ", - ), - Tab(icon: Icon(Icons.radio)), - ]), + padding: + EdgeInsets.only(left: 30, right: 30, bottom: 5), + child: TabBar( + indicatorSize: TabBarIndicatorSize.label, + tabs: [ + Tab( + text: ' Login ', + ), + Tab(icon: Icon(Icons.radio)), + ]), ), - decoration: BoxDecoration(color: Colors.yellow, borderRadius: BorderRadius.vertical(bottom: Radius.circular(30))), + decoration: BoxDecoration( + color: Colors.yellow, + borderRadius: BorderRadius.vertical( + bottom: Radius.circular(30))), ), // Spacer(flex: 12) ], @@ -40,7 +49,12 @@ class UserView extends StatelessWidget { height: MediaQuery.of(context).size.height * 0.25, child: Column( mainAxisAlignment: MainAxisAlignment.center, - children: [TextField(), TextField(), RaisedButton(onPressed: null), RaisedButton(onPressed: null)], + children: [ + TextField(), + TextField(), + ElevatedButton(onPressed: null, child: null), + ElevatedButton(onPressed: null, child: null), + ], ), ), ), diff --git a/lib/view/authenticate/test/view/test_view.dart b/lib/view/authenticate/test/view/test_view.dart index ed21a41..612a519 100644 --- a/lib/view/authenticate/test/view/test_view.dart +++ b/lib/view/authenticate/test/view/test_view.dart @@ -38,7 +38,8 @@ class _TestsViewState extends BaseState { AppBar appBar() { return AppBar( - leading: Text(LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN)), + leading: + Text(LocaleManager.instance.getStringValue(PreferencesKeys.TOKEN)), title: textWelcomeWidget(), actions: [iconButtonChangeTheme()], ); @@ -74,6 +75,7 @@ class _TestsViewState extends BaseState { } extension _FormArea on _TestsViewState { + // ignore: unused_element TextFormField get mailField => TextFormField( validator: (value) => value.isValidEmail, ); diff --git a/lib/view/authenticate/test/viewmodel/test_view_model.dart b/lib/view/authenticate/test/viewmodel/test_view_model.dart index a70487a..c1c89f9 100644 --- a/lib/view/authenticate/test/viewmodel/test_view_model.dart +++ b/lib/view/authenticate/test/viewmodel/test_view_model.dart @@ -13,10 +13,12 @@ part 'test_view_model.g.dart'; class TestViewModel = _TestViewModelBase with _$TestViewModel; abstract class _TestViewModelBase with Store, BaseViewModel { + @override void setContext(BuildContext context) { this.context = context; } + @override void init() {} @observable @@ -34,14 +36,16 @@ abstract class _TestViewModelBase with Store, BaseViewModel { } void changeTheme() { - Provider.of(context, listen: false).changeValue(AppThemes.DARK); + Provider.of(context, listen: false) + .changeValue(AppThemes.DARK); } @action Future getSampleRequest() async { isLoading = true; - final response = await coreDio.fetch, TestModel>("x", type: HttpTypes.GET, parseModel: TestModel()); + final response = await coreDio.fetch, TestModel>('x', + type: HttpTypes.GET, parseModel: TestModel()); if (response.data is List) { } else {} isLoading = false; diff --git a/lib/view/home/build/feed/model/house_model.dart b/lib/view/home/build/feed/model/house_model.dart index b35fb9b..c2a679a 100644 --- a/lib/view/home/build/feed/model/house_model.dart +++ b/lib/view/home/build/feed/model/house_model.dart @@ -5,7 +5,7 @@ part 'house_model.g.dart'; @JsonSerializable() class HouseModel extends INetworkModel { - @JsonKey(name: "_id") + @JsonKey(name: '_id') String id; String title; String description; @@ -13,7 +13,8 @@ class HouseModel extends INetworkModel { UserHouse user; int iV; - HouseModel({this.id, this.title, this.description, this.image, this.user, this.iV}); + HouseModel( + {this.id, this.title, this.description, this.image, this.user, this.iV}); @override HouseModel fromJson(Map json) { @@ -28,7 +29,7 @@ class HouseModel extends INetworkModel { @JsonSerializable() class UserHouse extends INetworkModel { - @JsonKey(name: "_id") + @JsonKey(name: '_id') String id; String name; String image; diff --git a/lib/view/home/build/feed/view/build_feed_view.dart b/lib/view/home/build/feed/view/build_feed_view.dart index 7f36d70..aa60511 100644 --- a/lib/view/home/build/feed/view/build_feed_view.dart +++ b/lib/view/home/build/feed/view/build_feed_view.dart @@ -19,7 +19,8 @@ class BuildFeedView extends StatelessWidget { model.init(); model.getListAll(); }, - onPageBuilder: (BuildContext context, BuildFeedViewModel viewModel) => Scaffold( + onPageBuilder: (BuildContext context, BuildFeedViewModel viewModel) => + Scaffold( key: viewModel.scaffoldKey, appBar: buildAppBar(), body: DefaultTabController( @@ -27,22 +28,26 @@ class BuildFeedView extends StatelessWidget { child: Observer(builder: (_) { return viewModel.isLoaindg ? buildCenter() - : viewModel.houseModels == null || viewModel.houseModels.isEmpty - ? Center(child: Text("Not Found")) + : viewModel.houseModels == null || + viewModel.houseModels.isEmpty + ? Center(child: Text('Not Found')) : buildListViewRecommended(viewModel, context); })), ), ); } - ListView buildListViewRecommended(BuildFeedViewModel viewModel, BuildContext context) { + ListView buildListViewRecommended( + BuildFeedViewModel viewModel, BuildContext context) { return ListView( padding: context.paddingLow, children: [ buildTabBar(viewModel), buildSizedBoxLAtestPageView(context, viewModel), context.emptySizedHeightBoxLow, - Text(LocaleKeys.home_build_subTitle.tr(), style: context.textTheme.headline5.copyWith(fontWeight: FontWeight.w600)), + Text(LocaleKeys.home_build_subTitle.tr(), + style: context.textTheme.headline5 + .copyWith(fontWeight: FontWeight.w600)), context.emptySizedHeightBoxLow, buildListBottom(viewModel) ], @@ -57,7 +62,9 @@ class BuildFeedView extends StatelessWidget { child: Card( child: Row( children: [ - Expanded(flex: 3, child: Image.network(viewModel.houseModels[index].image)), + Expanded( + flex: 3, + child: Image.network(viewModel.houseModels[index].image)), Expanded(flex: 9, child: buildObserver(viewModel, index)), ], ), @@ -79,24 +86,29 @@ class BuildFeedView extends StatelessWidget { }); } - SizedBox buildSizedBoxLAtestPageView(BuildContext context, BuildFeedViewModel viewModel) { + SizedBox buildSizedBoxLAtestPageView( + BuildContext context, BuildFeedViewModel viewModel) { return SizedBox( height: context.dynamicHeight(0.3), child: PageView.builder( controller: PageController(viewportFraction: 0.95), - itemBuilder: (context, index) => buildStackFloaty(context, viewModel.sliderHouse, viewModel), + itemBuilder: (context, index) => + buildStackFloaty(context, viewModel.sliderHouse, viewModel), itemCount: 3, ), ); } TabBar buildTabBar(BuildFeedViewModel viewModel) { - return TabBar(indicator: viewModel.helper.circleDecoriaton, indicatorSize: TabBarIndicatorSize.label, tabs: [ - Tab(text: LocaleKeys.home_build_tabbar_tab1.tr()), - Tab(text: LocaleKeys.home_build_tabbar_tab2.tr()), - Tab(text: LocaleKeys.home_build_tabbar_tab3.tr()), - Tab(text: LocaleKeys.home_build_tabbar_tab4.tr()), - ]); + return TabBar( + indicator: viewModel.helper.circleDecoriaton, + indicatorSize: TabBarIndicatorSize.label, + tabs: [ + Tab(text: LocaleKeys.home_build_tabbar_tab1.tr()), + Tab(text: LocaleKeys.home_build_tabbar_tab2.tr()), + Tab(text: LocaleKeys.home_build_tabbar_tab3.tr()), + Tab(text: LocaleKeys.home_build_tabbar_tab4.tr()), + ]); } Center buildCenter() => Center(child: CircularProgressIndicator()); @@ -105,24 +117,35 @@ class BuildFeedView extends StatelessWidget { return AppBar( backgroundColor: Colors.transparent, elevation: 0, - leading: IconButton(icon: Icon(Icons.format_align_left), onPressed: () {}), + leading: + IconButton(icon: Icon(Icons.format_align_left), onPressed: () {}), actions: [IconButton(icon: Icon(Icons.search), onPressed: () {})], ); } - Widget buildStackFloaty(BuildContext context, HouseModel model, BuildFeedViewModel viewModel) { + Widget buildStackFloaty( + BuildContext context, HouseModel model, BuildFeedViewModel viewModel) { return Padding( padding: EdgeInsets.only(right: context.lowValue), child: Stack( children: [ - Positioned.fill(bottom: 100, left: -50, right: -50, child: Image.network(model.image, fit: BoxFit.cover)), - Positioned(top: 120, left: 10, right: 10, child: buildCardFloaty(context, model, viewModel)) + Positioned.fill( + bottom: 100, + left: -50, + right: -50, + child: Image.network(model.image, fit: BoxFit.cover)), + Positioned( + top: 120, + left: 10, + right: 10, + child: buildCardFloaty(context, model, viewModel)) ], ), ); } - Card buildCardFloaty(BuildContext context, HouseModel model, BuildFeedViewModel viewModel) { + Card buildCardFloaty( + BuildContext context, HouseModel model, BuildFeedViewModel viewModel) { return Card( child: Padding( padding: context.paddingLow, diff --git a/lib/view/home/game/view/subview/game_view_cards.dart b/lib/view/home/game/view/subview/game_view_cards.dart index 46e2804..7fc72fa 100644 --- a/lib/view/home/game/view/subview/game_view_cards.dart +++ b/lib/view/home/game/view/subview/game_view_cards.dart @@ -5,7 +5,10 @@ extension _GameViewGamesCard on GameView { return viewModel.onNewsGameItems().toBuild>( onSuccess: (data) { return Column( - children: [HeaderButton(titleText: LocaleKeys.home_game_newUpdate), GameGrid(models: data)], + children: [ + HeaderButton(titleText: LocaleKeys.home_game_newUpdate), + GameGrid(models: data) + ], ); }, loaindgWidget: SizedBox( @@ -16,8 +19,8 @@ extension _GameViewGamesCard on GameView { highlightColor: Colors.grey[200], child: ListTile( leading: CircleAvatar(), - title: Text("data"), - subtitle: Text("data"), + title: Text('data'), + subtitle: Text('data'), ), ), ), diff --git a/lib/view/home/social/view/social_view.dart b/lib/view/home/social/view/social_view.dart index 4d65db6..3f3c28d 100644 --- a/lib/view/home/social/view/social_view.dart +++ b/lib/view/home/social/view/social_view.dart @@ -17,12 +17,14 @@ class SocialView extends StatelessWidget { @override Widget build(BuildContext context) { return BaseView( - viewModel: SocialViewModel(SocailService(VexanaManager.instance.networkManager, scaffoldKey)), + viewModel: SocialViewModel( + SocailService(VexanaManager.instance.networkManager, scaffoldKey)), onModelReady: (model) { model.setContext(context); model.init(); }, - onPageBuilder: (BuildContext context, SocialViewModel viewModel) => Container( + onPageBuilder: (BuildContext context, SocialViewModel viewModel) => + Container( color: context.colorScheme.background, padding: context.paddingLow, child: Scaffold( @@ -36,10 +38,15 @@ class SocialView extends StatelessWidget { onChanged: (value) { viewModel.fetchAllSearchQuery(value); }, - decoration: InputDecoration(prefixIcon: Icon(Icons.search, color: context.colorScheme.onSecondary.withOpacity(0.2))), + decoration: InputDecoration( + prefixIcon: Icon(Icons.search, + color: + context.colorScheme.onSecondary.withOpacity(0.2))), ), Spacer(flex: 2), - Expanded(flex: 90, child: Observer(builder: (_) => buildListViewUser(viewModel))) + Expanded( + flex: 90, + child: Observer(builder: (_) => buildListViewUser(viewModel))) ], ), ), @@ -51,25 +58,57 @@ class SocialView extends StatelessWidget { return AppBar( backgroundColor: Colors.transparent, elevation: 0, - leading: FlatButton(onPressed: () {}, padding: EdgeInsets.zero, child: Text(LocaleKeys.home_social_cancel).tr()), + leading: TextButton( + onPressed: () {}, + child: Text(LocaleKeys.home_social_cancel).tr(), + style: ButtonStyle( + padding: MaterialStateProperty.all(EdgeInsets.zero), + ), + ), actions: [ - FlatButton( - onPressed: () {}, - child: Text( - LocaleKeys.home_social_next, - style: context.textTheme.subtitle1.copyWith( - fontWeight: FontWeight.w600, - color: context.appTheme.buttonTheme.colorScheme.onError, - ), - ).tr()) + TextButton( + onPressed: () {}, + child: Text( + LocaleKeys.home_social_next, + style: context.textTheme.subtitle1.copyWith( + fontWeight: FontWeight.w600, + color: context.appTheme.buttonTheme.colorScheme.onError, + ), + ).tr(), + ), ], ); } + /* BEFORE: Flutter2.0 + + FlatButton( + onPressed: () {}, + padding: EdgeInsets.zero, + child: Text(LocaleKeys.home_social_cancel).tr(), + ), + + + + + FlatButton( + onPressed: () {}, + child: Text( + LocaleKeys.home_social_next, + style: context.textTheme.subtitle1.copyWith( + fontWeight: FontWeight.w600, + color: context.appTheme.buttonTheme.colorScheme.onError, + ), + ).tr(), + ), + + */ + Text buildTextFindFriends(BuildContext context) { return Text( LocaleKeys.home_social_findFriends, - style: context.textTheme.headline4.copyWith(fontWeight: FontWeight.bold, color: context.colorScheme.onSecondary), + style: context.textTheme.headline4.copyWith( + fontWeight: FontWeight.bold, color: context.colorScheme.onSecondary), ); } @@ -80,7 +119,8 @@ class SocialView extends StatelessWidget { viewModel.fetchAllUserLoading(index); return OpenContainerSocailWrapper( socialUser: viewModel.socialUserList[index], - closedBuilder: (BuildContext _, VoidCallback openContainer) => FriendCard( + closedBuilder: (BuildContext _, VoidCallback openContainer) => + FriendCard( user: viewModel.socialUserList[index], onPressed: openContainer, ), diff --git a/lib/view/home/social/viewmodel/social_view_model.dart b/lib/view/home/social/viewmodel/social_view_model.dart index ffaae9b..d8731e9 100644 --- a/lib/view/home/social/viewmodel/social_view_model.dart +++ b/lib/view/home/social/viewmodel/social_view_model.dart @@ -6,7 +6,6 @@ import 'package:mobx/mobx.dart'; import '../../../../core/base/model/base_view_model.dart'; import '../model/social_user_model.dart'; import '../service/ISocialService.dart'; -import '../service/socail_service.dart'; part 'social_view_model.g.dart'; diff --git a/pubspec.lock b/pubspec.lock index df98e9e..b4596e1 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -42,7 +42,7 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.5.0-nullsafety.1" + version: "2.5.0" auto_size_text: dependency: "direct main" description: @@ -56,7 +56,7 @@ packages: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.1" + version: "2.1.0" build: dependency: transitive description: @@ -126,14 +126,14 @@ packages: name: characters url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.3" + version: "1.1.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0" checked_yaml: dependency: transitive description: @@ -154,7 +154,7 @@ packages: name: clock url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.1" + version: "1.1.0" code_builder: dependency: transitive description: @@ -168,7 +168,7 @@ packages: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.15.0-nullsafety.3" + version: "1.15.0" convert: dependency: transitive description: @@ -224,14 +224,14 @@ packages: name: easy_localization url: "https://pub.dartlang.org" source: hosted - version: "2.3.3" + version: "2.3.3+1" fake_async: dependency: transitive description: name: fake_async url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0" ffi: dependency: transitive description: @@ -245,7 +245,7 @@ packages: name: file url: "https://pub.dartlang.org" source: hosted - version: "5.2.1" + version: "6.1.0" fixnum: dependency: transitive description: @@ -349,7 +349,7 @@ packages: name: intl url: "https://pub.dartlang.org" source: hosted - version: "0.16.1" + version: "0.17.0" io: dependency: transitive description: @@ -363,7 +363,7 @@ packages: name: js url: "https://pub.dartlang.org" source: hosted - version: "0.6.2" + version: "0.6.3" json_annotation: dependency: "direct main" description: @@ -405,14 +405,14 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.10-nullsafety.1" + version: "0.12.10" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.3" + version: "1.3.0" mime: dependency: transitive description: @@ -461,7 +461,7 @@ packages: name: node_io url: "https://pub.dartlang.org" source: hosted - version: "1.2.0" + version: "1.1.1" octo_image: dependency: transitive description: @@ -482,7 +482,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.1" + version: "1.8.0" path_drawing: dependency: transitive description: @@ -552,7 +552,7 @@ packages: name: platform url: "https://pub.dartlang.org" source: hosted - version: "2.2.1" + version: "3.0.0" plugin_platform_interface: dependency: transitive description: @@ -573,7 +573,7 @@ packages: name: process url: "https://pub.dartlang.org" source: hosted - version: "3.0.13" + version: "4.2.1" provider: dependency: "direct main" description: @@ -697,7 +697,7 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.8.0-nullsafety.2" + version: "1.8.0" sqflite: dependency: transitive description: @@ -718,14 +718,14 @@ packages: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.10.0-nullsafety.1" + version: "1.10.0" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.1" + version: "2.1.0" stream_transform: dependency: transitive description: @@ -739,7 +739,7 @@ packages: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.1.0-nullsafety.1" + version: "1.1.0" synchronized: dependency: transitive description: @@ -753,14 +753,14 @@ packages: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.2.0-nullsafety.1" + version: "1.2.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.19-nullsafety.2" + version: "0.2.19" timing: dependency: transitive description: @@ -774,7 +774,7 @@ packages: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.3.0-nullsafety.3" + version: "1.3.0" url_launcher: dependency: transitive description: @@ -830,7 +830,7 @@ packages: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.1.0-nullsafety.3" + version: "2.1.0" vexana: dependency: "direct main" description: @@ -881,5 +881,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=2.10.2 <2.11.0" - flutter: ">=1.22.2 <2.0.0" + dart: ">=2.12.0-0.0 <3.0.0" + flutter: ">=1.22.2" diff --git a/test/core/extension/string_extension_test.dart b/test/core/extension/string_extension_test.dart index 830f93b..3082093 100644 --- a/test/core/extension/string_extension_test.dart +++ b/test/core/extension/string_extension_test.dart @@ -1,10 +1,10 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:fluttermvvmtemplate/core/extension/string_extension.dart'; -main() { +Future main() async { setUp(() {}); - test("Email Regexp", () { - String email = "joedoe@gmail.com"; + test('Email Regexp', () { + var email = 'joedoe@gmail.com'; expect(email.isValidEmail, null); }); } diff --git a/test/core/network/core_dio_mock.dart b/test/core/network/core_dio_mock.dart index 4e7d92c..0e9e56f 100644 --- a/test/core/network/core_dio_mock.dart +++ b/test/core/network/core_dio_mock.dart @@ -3,7 +3,6 @@ import 'dart:io'; import 'package:dio/adapter.dart'; import 'package:dio/dio.dart'; -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:fluttermvvmtemplate/core/base/model/base_error.dart'; import 'package:fluttermvvmtemplate/core/constants/enums/http_request_enum.dart'; @@ -23,8 +22,13 @@ class CoreDioMock with DioMixin implements ICoreDioFull, Dio { } @override Future> fetch(String path, - {HttpTypes type, T parseModel, data, Map queryParameters, void Function(int p1, int p2) onReceiveProgress}) async { - final response = await request(path, data: data, options: Options(method: type.rawValue)); + {HttpTypes type, + T parseModel, + data, + Map queryParameters, + void Function(int p1, int p2) onReceiveProgress}) async { + final response = await request(path, + data: data, options: Options(method: type.rawValue)); switch (response.statusCode) { case HttpStatus.ok: @@ -38,7 +42,11 @@ class CoreDioMock with DioMixin implements ICoreDioFull, Dio { @override Future> fetchNoNetwork(String path, - {HttpTypes type, T parseModel, data, Map queryParameters, void Function(int p1, int p2) onReceiveProgress}) async { + {HttpTypes type, + T parseModel, + data, + Map queryParameters, + void Function(int p1, int p2) onReceiveProgress}) async { final dumyJson = '''[ { "userId": 1, diff --git a/test/core/network/core_dio_test.dart b/test/core/network/core_dio_test.dart index a32e797..b867544 100644 --- a/test/core/network/core_dio_test.dart +++ b/test/core/network/core_dio_test.dart @@ -5,37 +5,47 @@ import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart'; import 'core_dio_mock.dart'; import 'dio_mock_model.dart'; -main() { +Future main() async { ICoreDioFull service; setUp(() { - service = CoreDioMock(BaseOptions(baseUrl: 'https://jsonplaceholder.typicode.com')); + service = CoreDioMock( + BaseOptions(baseUrl: 'https://jsonplaceholder.typicode.com')); }); test('CoreDio List', () async { - final data = await service.fetch, PostModel>('/posts', type: HttpTypes.GET, parseModel: PostModel()); + final data = await service.fetch, PostModel>('/posts', + type: HttpTypes.GET, parseModel: PostModel()); expect(data.data, isList); }); test('CoreDio List No Network', () async { - final data = await service.fetchNoNetwork, PostModel>('/posts', type: HttpTypes.GET, parseModel: PostModel()); + final data = await service.fetchNoNetwork, PostModel>( + '/posts', + type: HttpTypes.GET, + parseModel: PostModel()); expect(data.data, isList); }); test('CoreDio Object', () async { - final data = await service.fetch, PostModel>('/posts', type: HttpTypes.GET, parseModel: PostModel()); + final data = await service.fetch, PostModel>('/posts', + type: HttpTypes.GET, parseModel: PostModel()); expect(data.data, isList); }); test('CoreDio Primitive', () async { - final data = await service.fetch, PostModel>('/posts', type: HttpTypes.GET, parseModel: PostModel()); + final data = await service.fetch, PostModel>('/posts', + type: HttpTypes.GET, parseModel: PostModel()); expect(data.data, isList); }); test('CoreDio Error', () async { - final data = await service.fetchNoNetwork, PostModel>('/posts', type: HttpTypes.GET, parseModel: PostModel()); + final data = await service.fetchNoNetwork, PostModel>( + '/posts', + type: HttpTypes.GET, + parseModel: PostModel()); expect(data.data, isList); }); diff --git a/test/feature/feed/social_feed_test.dart b/test/feature/feed/social_feed_test.dart index 64a2880..1e29196 100644 --- a/test/feature/feed/social_feed_test.dart +++ b/test/feature/feed/social_feed_test.dart @@ -26,7 +26,7 @@ void main() { }); test('Loading Test 2 ', () async { - socialMockViewModel.fetchAllUserLoading(1); + await socialMockViewModel.fetchAllUserLoading(1); expect(socialMockViewModel.isPageLoading, true); await Future.delayed(Duration(seconds: 1)); expect(socialMockViewModel.isPageLoading, false); diff --git a/test/feature/test/sample_view_test.dart b/test/feature/test/sample_view_test.dart index dc38201..4c6acc2 100644 --- a/test/feature/test/sample_view_test.dart +++ b/test/feature/test/sample_view_test.dart @@ -1,10 +1,9 @@ import 'package:flutter_test/flutter_test.dart'; -import 'package:fluttermvvmtemplate/core/init/network/ICoreDio.dart'; import 'package:fluttermvvmtemplate/core/init/network/network_manager.dart'; -main() { +Future main() async { setUp(() { final _ = NetworkManager.instance.coreDio; }); - test("Sample", () {}); + test('Sample', () {}); }