diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000000..3bb4049a441 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +Notable changes to the samples in this repository are listed here. + +## [Unreleased] + +### compass_app + +* Scope `LogoutViewModel` to the home route so it is not recreated on every + `HomeHeader` rebuild ([#2604](https://github.com/flutter/samples/issues/2604)). diff --git a/compass_app/app/lib/routing/router.dart b/compass_app/app/lib/routing/router.dart index 1ed94ed021e..28470685013 100644 --- a/compass_app/app/lib/routing/router.dart +++ b/compass_app/app/lib/routing/router.dart @@ -11,6 +11,7 @@ import '../ui/activities/view_models/activities_viewmodel.dart'; import '../ui/activities/widgets/activities_screen.dart'; import '../ui/auth/login/view_models/login_viewmodel.dart'; import '../ui/auth/login/widgets/login_screen.dart'; +import '../ui/auth/logout/view_models/logout_viewmodel.dart'; import '../ui/booking/view_models/booking_viewmodel.dart'; import '../ui/booking/widgets/booking_screen.dart'; import '../ui/home/view_models/home_viewmodel.dart'; @@ -46,7 +47,14 @@ GoRouter router(AuthRepository authRepository) => GoRouter( bookingRepository: context.read(), userRepository: context.read(), ); - return HomeScreen(viewModel: viewModel); + final logoutViewModel = LogoutViewModel( + authRepository: context.read(), + itineraryConfigRepository: context.read(), + ); + return HomeScreen( + viewModel: viewModel, + logoutViewModel: logoutViewModel, + ); }, routes: [ GoRoute( diff --git a/compass_app/app/lib/ui/home/widgets/home_screen.dart b/compass_app/app/lib/ui/home/widgets/home_screen.dart index fefe780038f..b252c1d5961 100644 --- a/compass_app/app/lib/ui/home/widgets/home_screen.dart +++ b/compass_app/app/lib/ui/home/widgets/home_screen.dart @@ -11,6 +11,7 @@ import '../../core/localization/applocalization.dart'; import '../../core/themes/colors.dart'; import '../../core/themes/dimens.dart'; import '../../core/ui/date_format_start_end.dart'; +import '../../auth/logout/view_models/logout_viewmodel.dart'; import '../../core/ui/error_indicator.dart'; import '../view_models/home_viewmodel.dart'; import 'home_title.dart'; @@ -18,9 +19,14 @@ import 'home_title.dart'; const String bookingButtonKey = 'booking-button'; class HomeScreen extends StatefulWidget { - const HomeScreen({super.key, required this.viewModel}); + const HomeScreen({ + super.key, + required this.viewModel, + required this.logoutViewModel, + }); final HomeViewModel viewModel; + final LogoutViewModel logoutViewModel; @override State createState() => _HomeScreenState(); @@ -88,7 +94,10 @@ class _HomeScreenState extends State { vertical: Dimens.of(context).paddingScreenVertical, horizontal: Dimens.of(context).paddingScreenHorizontal, ), - child: HomeHeader(viewModel: widget.viewModel), + child: HomeHeader( + viewModel: widget.viewModel, + logoutViewModel: widget.logoutViewModel, + ), ), ), SliverList.builder( diff --git a/compass_app/app/lib/ui/home/widgets/home_title.dart b/compass_app/app/lib/ui/home/widgets/home_title.dart index 165e7ffe507..16755793a64 100644 --- a/compass_app/app/lib/ui/home/widgets/home_title.dart +++ b/compass_app/app/lib/ui/home/widgets/home_title.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:provider/provider.dart'; import '../../auth/logout/view_models/logout_viewmodel.dart'; import '../../auth/logout/widgets/logout_button.dart'; @@ -13,9 +12,14 @@ import '../../core/themes/dimens.dart'; import '../view_models/home_viewmodel.dart'; class HomeHeader extends StatelessWidget { - const HomeHeader({super.key, required this.viewModel}); + const HomeHeader({ + super.key, + required this.viewModel, + required this.logoutViewModel, + }); final HomeViewModel viewModel; + final LogoutViewModel logoutViewModel; @override Widget build(BuildContext context) { @@ -37,12 +41,7 @@ class HomeHeader extends StatelessWidget { height: Dimens.of(context).profilePictureSize, ), ), - LogoutButton( - viewModel: LogoutViewModel( - authRepository: context.read(), - itineraryConfigRepository: context.read(), - ), - ), + LogoutButton(viewModel: logoutViewModel), ], ), const SizedBox(height: Dimens.paddingVertical), diff --git a/compass_app/app/test/ui/home/widgets/home_screen_test.dart b/compass_app/app/test/ui/home/widgets/home_screen_test.dart index 24890be413f..6d2e3b1eb04 100644 --- a/compass_app/app/test/ui/home/widgets/home_screen_test.dart +++ b/compass_app/app/test/ui/home/widgets/home_screen_test.dart @@ -2,16 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:compass_app/data/repositories/auth/auth_repository.dart'; -import 'package:compass_app/data/repositories/itinerary_config/itinerary_config_repository.dart'; import 'package:compass_app/routing/routes.dart'; +import 'package:compass_app/ui/auth/logout/view_models/logout_viewmodel.dart'; import 'package:compass_app/ui/home/view_models/home_viewmodel.dart'; import 'package:compass_app/ui/home/widgets/home_screen.dart'; import 'package:compass_app/utils/result.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mocktail/mocktail.dart'; -import 'package:provider/provider.dart'; import '../../../../testing/app.dart'; import '../../../../testing/fakes/repositories/fake_auth_repository.dart'; @@ -24,6 +21,7 @@ import '../../../../testing/models/booking.dart'; void main() { group('HomeScreen tests', () { late HomeViewModel viewModel; + late LogoutViewModel logoutViewModel; late MockGoRouter goRouter; late FakeBookingRepository bookingRepository; @@ -33,6 +31,10 @@ void main() { bookingRepository: bookingRepository, userRepository: FakeUserRepository(), ); + logoutViewModel = LogoutViewModel( + authRepository: FakeAuthRepository(), + itineraryConfigRepository: FakeItineraryConfigRepository(), + ); goRouter = MockGoRouter(); when(() => goRouter.push(any())).thenAnswer((_) => Future.value(null)); }); @@ -40,12 +42,9 @@ void main() { Future loadWidget(WidgetTester tester) async { await testApp( tester, - ChangeNotifierProvider.value( - value: FakeAuthRepository() as AuthRepository, - child: Provider.value( - value: FakeItineraryConfigRepository() as ItineraryConfigRepository, - child: HomeScreen(viewModel: viewModel), - ), + HomeScreen( + viewModel: viewModel, + logoutViewModel: logoutViewModel, ), goRouter: goRouter, );