perf(mornye): share chrome backdrops and scale blur to clarity

This commit is contained in:
zarzet committed 2026-10-02 01:24:26 +07:00
1 parent 718e13f24e
commit e200879d14
4 files changed
+186 -71

No files matched your search

+38
View File
@@ -137,6 +137,44 @@ void main() {
const albumBlue = Color(0xff464566);
testWidgets(
'player and navbar share a backdrop while moving capsules remain isolated',
(tester) async {
await pumpShell(tester, blur: true, liquidGlass: false);
void expectSharedBackdrop() {
final filters = find.descendant(
of: find.byType(MornyeBottomBar),
matching: find.byType(BackdropFilter),
);
final renderers = filters
.evaluate()
.map(
(element) => element.findRenderObject()! as RenderBackdropFilter,
)
.toList();
final shared = renderers
.where((filter) => filter.backdropKey != null)
.toList();
expect(shared, hasLength(2));
expect(shared[0].backdropKey, same(shared[1].backdropKey));
// Side capsules overlap the folding tabs and must not join their group.
expect(
renderers.where((filter) => filter.backdropKey == null),
hasLength(2),
);
}
expectSharedBackdrop();
chrome.value = true;
await tester.pump();
await tester.pump(const Duration(milliseconds: 190));
expectSharedBackdrop();
await tester.pumpAndSettle();
expectSharedBackdrop();
expect(tester.takeException(), isNull);
},
);
for (final liquidGlass in [false, true]) {
testWidgets(
'navbar keeps its backdrop blurred throughout motion (liquid: $liquidGlass)',
+50
View File
@@ -1,3 +1,5 @@
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
@@ -115,6 +117,54 @@ void main() {
expect(tester.takeException(), isNull);
});
testWidgets(
'low clarity uses a small blur and mid-range glass caps its radius',
(tester) async {
Future<ui.ImageFilter?> filterFor(double clarity, bool liquid) async {
await tester.pumpWidget(
ProviderScope(
key: UniqueKey(),
overrides: [
mornyeGlassLevelProvider.overrideWithValue(
liquid ? MornyeGlassLevel.liquid : MornyeGlassLevel.frosted,
),
],
child: MaterialApp(
theme: MornyeTheme.build(Brightness.light, glassClarity: clarity),
home: const MornyeGlass.navigation(
blurEnabled: true,
child: SizedBox(width: 200, height: 50),
),
),
),
);
final filters = tester.widgetList<BackdropFilter>(
find.byType(BackdropFilter),
);
return filters.isEmpty ? null : filters.single.filter;
}
expect(await filterFor(0, false), isNull);
expect(await filterFor(0.1, false), isNull);
expect(
await filterFor(0.25, false),
ui.ImageFilter.blur(sigmaX: 4, sigmaY: 4),
);
expect(
await filterFor(0.1, true),
ui.ImageFilter.blur(sigmaX: 4, sigmaY: 4),
);
expect(
await filterFor(1, false),
ui.ImageFilter.blur(sigmaX: 8, sigmaY: 8),
);
expect(
await filterFor(1, true),
ui.ImageFilter.blur(sigmaX: 18, sigmaY: 18),
);
},
);
for (final clarity in [0.0, 0.5]) {
testWidgets('liquid tab and segment pills follow clarity ($clarity)', (
tester,