Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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)).
10 changes: 9 additions & 1 deletion compass_app/app/lib/routing/router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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(
Expand Down
13 changes: 11 additions & 2 deletions compass_app/app/lib/ui/home/widgets/home_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,22 @@ 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';

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<HomeScreen> createState() => _HomeScreenState();
Expand Down Expand Up @@ -88,7 +94,10 @@ class _HomeScreenState extends State<HomeScreen> {
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(
Expand Down
15 changes: 7 additions & 8 deletions compass_app/app/lib/ui/home/widgets/home_title.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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) {
Expand All @@ -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),
Expand Down
19 changes: 9 additions & 10 deletions compass_app/app/test/ui/home/widgets/home_screen_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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;

Expand All @@ -33,19 +31,20 @@ void main() {
bookingRepository: bookingRepository,
userRepository: FakeUserRepository(),
);
logoutViewModel = LogoutViewModel(
authRepository: FakeAuthRepository(),
itineraryConfigRepository: FakeItineraryConfigRepository(),
);
goRouter = MockGoRouter();
when(() => goRouter.push(any())).thenAnswer((_) => Future.value(null));
});

Future<void> 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,
);
Expand Down