1
0
mirror of https://github.com/flutter/samples.git synced 2025-11-08 13:58:47 +00:00

Flutter 3.29 beta (#2571)

This commit is contained in:
Eric Windmill
2025-02-12 18:08:01 -05:00
committed by GitHub
parent d62c784789
commit 719fd72c38
685 changed files with 76244 additions and 53721 deletions

View File

@@ -20,10 +20,10 @@ class BookingViewModel extends ChangeNotifier {
required BookingShareUseCase shareBookingUseCase,
required ItineraryConfigRepository itineraryConfigRepository,
required BookingRepository bookingRepository,
}) : _createUseCase = createBookingUseCase,
_shareUseCase = shareBookingUseCase,
_itineraryConfigRepository = itineraryConfigRepository,
_bookingRepository = bookingRepository {
}) : _createUseCase = createBookingUseCase,
_shareUseCase = shareBookingUseCase,
_itineraryConfigRepository = itineraryConfigRepository,
_bookingRepository = bookingRepository {
createBooking = Command0(_createBooking);
shareBooking = Command0(() => _shareUseCase.shareBooking(_booking!));
loadBooking = Command1(_load);

View File

@@ -12,10 +12,7 @@ import '../view_models/booking_viewmodel.dart';
import 'booking_header.dart';
class BookingBody extends StatelessWidget {
const BookingBody({
super.key,
required this.viewModel,
});
const BookingBody({super.key, required this.viewModel});
final BookingViewModel viewModel;
@@ -30,13 +27,10 @@ class BookingBody extends StatelessWidget {
slivers: [
SliverToBoxAdapter(child: BookingHeader(booking: booking)),
SliverList(
delegate: SliverChildBuilderDelegate(
(context, index) {
final activity = booking.activity[index];
return _Activity(activity: activity);
},
childCount: booking.activity.length,
),
delegate: SliverChildBuilderDelegate((context, index) {
final activity = booking.activity[index];
return _Activity(activity: activity);
}, childCount: booking.activity.length),
),
const SliverToBoxAdapter(child: SizedBox(height: 200)),
],
@@ -47,9 +41,7 @@ class BookingBody extends StatelessWidget {
}
class _Activity extends StatelessWidget {
const _Activity({
required this.activity,
});
const _Activity({required this.activity});
final Activity activity;

View File

@@ -15,10 +15,7 @@ import '../../core/ui/home_button.dart';
import '../../core/ui/tag_chip.dart';
class BookingHeader extends StatelessWidget {
const BookingHeader({
super.key,
required this.booking,
});
const BookingHeader({super.key, required this.booking});
final Booking booking;
@@ -51,9 +48,7 @@ class BookingHeader extends StatelessWidget {
}
class _Top extends StatelessWidget {
const _Top({
required this.booking,
});
const _Top({required this.booking});
final Booking booking;
@@ -70,10 +65,7 @@ class _Top extends StatelessWidget {
Positioned(
right: Dimens.of(context).paddingScreenHorizontal,
top: Dimens.of(context).paddingScreenVertical,
child: const SafeArea(
top: true,
child: HomeButton(blur: true),
),
child: const SafeArea(top: true, child: HomeButton(blur: true)),
),
],
),
@@ -82,9 +74,7 @@ class _Top extends StatelessWidget {
}
class _Tags extends StatelessWidget {
const _Tags({
required this.booking,
});
const _Tags({required this.booking});
final Booking booking;
@@ -100,26 +90,25 @@ class _Tags extends StatelessWidget {
child: Wrap(
spacing: 6,
runSpacing: 6,
children: booking.destination.tags
.map(
(tag) => TagChip(
tag: tag,
fontSize: 16,
height: 32,
chipColor: chipColor,
onChipColor: Theme.of(context).colorScheme.onSurface,
),
)
.toList(),
children:
booking.destination.tags
.map(
(tag) => TagChip(
tag: tag,
fontSize: 16,
height: 32,
chipColor: chipColor,
onChipColor: Theme.of(context).colorScheme.onSurface,
),
)
.toList(),
),
);
}
}
class _Headline extends StatelessWidget {
const _Headline({
required this.booking,
});
const _Headline({required this.booking});
final Booking booking;
@@ -139,10 +128,7 @@ class _Headline extends StatelessWidget {
),
Text(
dateFormatStartEnd(
DateTimeRange(
start: booking.startDate,
end: booking.endDate,
),
DateTimeRange(start: booking.startDate, end: booking.endDate),
),
style: Theme.of(context).textTheme.headlineSmall,
),
@@ -154,9 +140,7 @@ class _Headline extends StatelessWidget {
}
class _HeaderImage extends StatelessWidget {
const _HeaderImage({
required this.booking,
});
const _HeaderImage({required this.booking});
final Booking booking;
@@ -180,10 +164,7 @@ class _Gradient extends StatelessWidget {
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Colors.transparent,
Theme.of(context).colorScheme.surface,
],
colors: [Colors.transparent, Theme.of(context).colorScheme.surface],
),
),
);

View File

@@ -12,10 +12,7 @@ import '../view_models/booking_viewmodel.dart';
import 'booking_body.dart';
class BookingScreen extends StatefulWidget {
const BookingScreen({
super.key,
required this.viewModel,
});
const BookingScreen({super.key, required this.viewModel});
final BookingViewModel viewModel;
@@ -47,16 +44,18 @@ class _BookingScreenState extends State<BookingScreen> {
child: Scaffold(
floatingActionButton: ListenableBuilder(
listenable: widget.viewModel,
builder: (context, _) => FloatingActionButton.extended(
// Workaround for https://github.com/flutter/flutter/issues/115358#issuecomment-2117157419
heroTag: null,
key: const ValueKey('share-button'),
onPressed: widget.viewModel.booking != null
? widget.viewModel.shareBooking.execute
: null,
label: Text(AppLocalization.of(context).shareTrip),
icon: const Icon(Icons.share_outlined),
),
builder:
(context, _) => FloatingActionButton.extended(
// Workaround for https://github.com/flutter/flutter/issues/115358#issuecomment-2117157419
heroTag: null,
key: const ValueKey('share-button'),
onPressed:
widget.viewModel.booking != null
? widget.viewModel.shareBooking.execute
: null,
label: Text(AppLocalization.of(context).shareTrip),
icon: const Icon(Icons.share_outlined),
),
),
body: ListenableBuilder(
// Listen to changes in both commands
@@ -68,9 +67,7 @@ class _BookingScreenState extends State<BookingScreen> {
// If either command is running, show progress indicator
if (widget.viewModel.createBooking.running ||
widget.viewModel.loadBooking.running) {
return const Center(
child: CircularProgressIndicator(),
);
return const Center(child: CircularProgressIndicator());
}
// If fails to create booking, tap to try again
if (widget.viewModel.createBooking.error) {
@@ -103,13 +100,15 @@ class _BookingScreenState extends State<BookingScreen> {
void _listener() {
if (widget.viewModel.shareBooking.error) {
widget.viewModel.shareBooking.clearResult();
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(AppLocalization.of(context).errorWhileSharing),
action: SnackBarAction(
label: AppLocalization.of(context).tryAgain,
onPressed: widget.viewModel.shareBooking.execute,
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(AppLocalization.of(context).errorWhileSharing),
action: SnackBarAction(
label: AppLocalization.of(context).tryAgain,
onPressed: widget.viewModel.shareBooking.execute,
),
),
));
);
}
}
}