Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix/ eliminate jumping scroll in home view #122

Merged
merged 3 commits into from
Aug 3, 2024
Merged
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
6 changes: 4 additions & 2 deletions lib/config/map_view_config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,10 @@ abstract class MapWidgetConfig {
);
static const mapType = MapType.normal;

static const mapMarkerOriginWidth = 28;
static const activeMapMarkerOriginWidth = 40;
static const mapMarkerWidth = 22.0;
static const mapMarkerHeight = 34.0;
static const activeMapMarkerWidth = 30.4;
static const activeMapMarkerHeight = 46.4;
}

abstract class BuildingSearchConfig {
Expand Down
3 changes: 0 additions & 3 deletions lib/config/transitions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ import "package:auto_route/auto_route.dart";
// TODO(simon-the-shark): adjust this settings if desired
abstract class TransitionsConfig {
static const durationInMiliseconds = 200;
static const detailDurationInMiliseconds = 200;
static const slideLeftBuilder = TransitionsBuilders.slideLeftWithFade;
static const slideRightBuilder = TransitionsBuilders.slideRightWithFade;
static const fallbackBuilder = TransitionsBuilders.fadeIn;
static const detailViewBuilder = TransitionsBuilders.slideBottom;
}
10 changes: 8 additions & 2 deletions lib/features/home_view/widgets/news_section.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,19 @@ class _NewsList extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(newsRepositoryProvider);

return switch (state) {
AsyncLoading() => const Padding(
padding: EdgeInsets.only(
left: HomeViewConfig.paddingMedium,
top: HomeViewConfig.paddingMedium,
top: HomeViewConfig.paddingMedium *
2, // twice the padding of normal state, just to look cool
),
child: SizedBox(
height:
BigPreviewCardConfig.cardHeight - HomeViewConfig.paddingMedium,
child: BigScrollableSectionLoading(),
),
child: BigScrollableSectionLoading(),
),
AsyncError(:final error) => MyErrorWidget(error),
AsyncValue(:final value) => Column(
Expand Down
60 changes: 26 additions & 34 deletions lib/features/map_view/utils/map_marker_utils.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
import "dart:ui" as ui;

import "package:flutter/foundation.dart";
import "package:flutter/services.dart";
import "package:flutter/widgets.dart";
import "package:google_maps_flutter/google_maps_flutter.dart";

Expand All @@ -15,47 +12,42 @@ class MapMarkerUtils {
static late final BitmapDescriptor activeParkingMapMarker;

static Future<void> loadMapMarkerAssets(BuildContext context) async {
final pixelRatio =
kIsWeb ? 1 : MediaQuery.devicePixelRatioOf(context).toInt();

buildingMapMarker = await _AssetScaledLoader.loadScaledBitmapDescriptor(
final configuration = context.mapMarkerConfiguration;
final activeMarkerConfig = context.activeMapMarkerConfiguration;
buildingMapMarker = await BitmapDescriptor.asset(
configuration,
Assets.mapMarkers.mapMarker.path,
width: MapWidgetConfig.mapMarkerOriginWidth * pixelRatio,
);

activeBuildingMapMarker =
await _AssetScaledLoader.loadScaledBitmapDescriptor(
activeBuildingMapMarker = await BitmapDescriptor.asset(
activeMarkerConfig,
Assets.mapMarkers.activeMapMarker.path,
width: MapWidgetConfig.activeMapMarkerOriginWidth * pixelRatio,
);
parkingMapMarker = await _AssetScaledLoader.loadScaledBitmapDescriptor(
parkingMapMarker = await BitmapDescriptor.asset(
configuration,
Assets.mapMarkers.parkingMapMarker.path,
width: MapWidgetConfig.mapMarkerOriginWidth * pixelRatio,
);
activeParkingMapMarker =
await _AssetScaledLoader.loadScaledBitmapDescriptor(
activeParkingMapMarker = await BitmapDescriptor.asset(
activeMarkerConfig,
Assets.mapMarkers.activeParkingMapMarker.path,
width: MapWidgetConfig.activeMapMarkerOriginWidth * pixelRatio,
);
}
}

class _AssetScaledLoader {
static Future<BitmapDescriptor> loadScaledBitmapDescriptor(
String assetName, {
required int width,
}) async {
try {
final data = await rootBundle.load(assetName);
final codec = await ui.instantiateImageCodec(
data.buffer.asUint8List(),
targetWidth: width,
extension _ImageConfigurationX on BuildContext {
double get pixelRatio => kIsWeb ? 1.0 : MediaQuery.devicePixelRatioOf(this);

ImageConfiguration get mapMarkerConfiguration => ImageConfiguration(
devicePixelRatio: pixelRatio,
size: const Size(
MapWidgetConfig.mapMarkerWidth,
MapWidgetConfig.mapMarkerHeight,
),
);
ImageConfiguration get activeMapMarkerConfiguration => ImageConfiguration(
devicePixelRatio: pixelRatio,
size: const Size(
MapWidgetConfig.activeMapMarkerWidth,
MapWidgetConfig.activeMapMarkerHeight,
),
);
final fi = await codec.getNextFrame();
final decode = await fi.image.toByteData(format: ui.ImageByteFormat.png);
return BitmapDescriptor.bytes(decode!.buffer.asUint8List());
} on Exception {
return BitmapDescriptor.defaultMarker; // fallback
}
}
}
22 changes: 3 additions & 19 deletions lib/features/navigator/app_router.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import "package:auto_route/auto_route.dart";
import "package:flutter/foundation.dart";
import "package:flutter/material.dart";
import "package:flutter_riverpod/flutter_riverpod.dart";
import "package:riverpod_annotation/riverpod_annotation.dart";
Expand Down Expand Up @@ -67,14 +66,9 @@ class AppRouter extends _$AppRouter {
transitionsBuilder:
ref.tabBarTransitionBuilder(DepartmentsRoute.name),
),
CustomRoute(
AutoRoute(
path: "departments/:id",
page: DepartmentDetailRoute.page,
durationInMilliseconds:
TransitionsConfig.detailDurationInMiliseconds,
reverseDurationInMilliseconds:
TransitionsConfig.detailDurationInMiliseconds,
transitionsBuilder: TransitionsConfig.detailViewBuilder,
),
CustomRoute(
path: "sci-clubs",
Expand All @@ -85,14 +79,9 @@ class AppRouter extends _$AppRouter {
transitionsBuilder:
ref.tabBarTransitionBuilder(ScienceClubsRoute.name),
),
CustomRoute(
AutoRoute(
path: "sci-clubs/:id",
page: ScienceClubDetailRoute.page,
durationInMilliseconds:
TransitionsConfig.detailDurationInMiliseconds,
reverseDurationInMilliseconds:
TransitionsConfig.detailDurationInMiliseconds,
transitionsBuilder: TransitionsConfig.detailViewBuilder,
),
CustomRoute(
path: "guide",
Expand All @@ -102,14 +91,9 @@ class AppRouter extends _$AppRouter {
TransitionsConfig.durationInMiliseconds,
transitionsBuilder: ref.tabBarTransitionBuilder(GuideRoute.name),
),
CustomRoute(
AutoRoute(
path: "aboutUs",
page: AboutUsRoute.page,
durationInMilliseconds:
TransitionsConfig.detailDurationInMiliseconds,
reverseDurationInMilliseconds:
TransitionsConfig.detailDurationInMiliseconds,
transitionsBuilder: TransitionsConfig.detailViewBuilder,
),
],
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class BigPreviewCardLoading extends StatelessWidget {
ShimmerLoadingItem(
child: Container(
width: BigPreviewCardConfig.cardWidth,
height: 135,
height: 155,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8),
Expand All @@ -35,13 +35,22 @@ class _LoadingText extends StatelessWidget {

@override
Widget build(BuildContext context) {
const gap = 22.5;
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 16),
PreviewTextPrototype(width: BigPreviewCardConfig.cardWidth),
const SizedBox(height: 16),
PreviewTextPrototype(width: BigPreviewCardConfig.cardWidth / 1.5),
const SizedBox(height: gap),
PreviewTextPrototype(width: BigPreviewCardConfig.cardWidth, height: 25),
const SizedBox(height: gap),
PreviewTextPrototype(
width: BigPreviewCardConfig.cardWidth / 1.3,
height: 25,
),
const SizedBox(height: gap),
PreviewTextPrototype(
width: BigPreviewCardConfig.cardWidth / 2.5,
height: 25,
),
],
);
}
Expand Down