improve fidelity for CupertinoBottomSheet
* set CupertinoUserInterfaceLabel to elevated for top route * animate theme for route in background
Showing
1 changed file
with
98 additions
and
2 deletions
| @@ -4,7 +4,15 @@ | @@ -4,7 +4,15 @@ | ||
| 4 | 4 | ||
| 5 | import 'dart:async'; | 5 | import 'dart:async'; |
| 6 | 6 | ||
| 7 | -import 'package:flutter/cupertino.dart' show CupertinoTheme, CupertinoApp; | 7 | +import 'package:flutter/cupertino.dart' |
| 8 | + show | ||
| 9 | + CupertinoApp, | ||
| 10 | + CupertinoColors, | ||
| 11 | + CupertinoDynamicColor, | ||
| 12 | + CupertinoTheme, | ||
| 13 | + CupertinoThemeData, | ||
| 14 | + CupertinoUserInterfaceLevel, | ||
| 15 | + CupertinoUserInterfaceLevelData; | ||
| 8 | import 'package:flutter/material.dart' | 16 | import 'package:flutter/material.dart' |
| 9 | show | 17 | show |
| 10 | Colors, | 18 | Colors, |
| @@ -61,10 +69,13 @@ class _CupertinoBottomSheetContainer extends StatelessWidget { | @@ -61,10 +69,13 @@ class _CupertinoBottomSheetContainer extends StatelessWidget { | ||
| 61 | child: MediaQuery.removePadding( | 69 | child: MediaQuery.removePadding( |
| 62 | context: context, | 70 | context: context, |
| 63 | removeTop: true, //Remove top Safe Area | 71 | removeTop: true, //Remove top Safe Area |
| 72 | + child: CupertinoUserInterfaceLevel( | ||
| 73 | + data: CupertinoUserInterfaceLevelData.elevated, | ||
| 64 | child: child, | 74 | child: child, |
| 65 | ), | 75 | ), |
| 66 | ), | 76 | ), |
| 67 | ), | 77 | ), |
| 78 | + ), | ||
| 68 | ); | 79 | ); |
| 69 | } | 80 | } |
| 70 | } | 81 | } |
| @@ -272,7 +283,22 @@ class _CupertinoModalTransition extends StatelessWidget { | @@ -272,7 +283,22 @@ class _CupertinoModalTransition extends StatelessWidget { | ||
| 272 | alignment: Alignment.topCenter, | 283 | alignment: Alignment.topCenter, |
| 273 | child: ClipRRect( | 284 | child: ClipRRect( |
| 274 | borderRadius: BorderRadius.circular(radius), | 285 | borderRadius: BorderRadius.circular(radius), |
| 275 | - child: child), | 286 | + child: CupertinoUserInterfaceLevel( |
| 287 | + data: CupertinoUserInterfaceLevelData.elevated, | ||
| 288 | + child: Builder( | ||
| 289 | + builder: (context) => CupertinoTheme( | ||
| 290 | + data: createPreviousRouteTheme( | ||
| 291 | + context, | ||
| 292 | + curvedAnimation, | ||
| 293 | + ), | ||
| 294 | + child: CupertinoUserInterfaceLevel( | ||
| 295 | + data: CupertinoUserInterfaceLevelData.base, | ||
| 296 | + child: child!, | ||
| 297 | + ), | ||
| 298 | + ), | ||
| 299 | + ), | ||
| 300 | + ), | ||
| 301 | + ), | ||
| 276 | ), | 302 | ), |
| 277 | ), | 303 | ), |
| 278 | ], | 304 | ], |
| @@ -281,6 +307,76 @@ class _CupertinoModalTransition extends StatelessWidget { | @@ -281,6 +307,76 @@ class _CupertinoModalTransition extends StatelessWidget { | ||
| 281 | ), | 307 | ), |
| 282 | ); | 308 | ); |
| 283 | } | 309 | } |
| 310 | + | ||
| 311 | + CupertinoThemeData createPreviousRouteTheme( | ||
| 312 | + BuildContext context, | ||
| 313 | + Animation<double> animation, | ||
| 314 | + ) { | ||
| 315 | + final cTheme = CupertinoTheme.of(context); | ||
| 316 | + | ||
| 317 | + final systemBackground = CupertinoDynamicColor.resolve( | ||
| 318 | + cTheme.scaffoldBackgroundColor, | ||
| 319 | + context, | ||
| 320 | + ); | ||
| 321 | + | ||
| 322 | + final barBackgroundColor = CupertinoDynamicColor.resolve( | ||
| 323 | + cTheme.barBackgroundColor, | ||
| 324 | + context, | ||
| 325 | + ); | ||
| 326 | + | ||
| 327 | + var previousRouteTheme = cTheme; | ||
| 328 | + | ||
| 329 | + if (cTheme.scaffoldBackgroundColor is CupertinoDynamicColor) { | ||
| 330 | + final dynamicScaffoldBackgroundColor = | ||
| 331 | + cTheme.scaffoldBackgroundColor as CupertinoDynamicColor; | ||
| 332 | + | ||
| 333 | + /// BackgroundColor for the previous route with forced using | ||
| 334 | + /// of the elevated colors | ||
| 335 | + final elevatedScaffoldBackgroundColor = | ||
| 336 | + CupertinoDynamicColor.withBrightnessAndContrast( | ||
| 337 | + color: dynamicScaffoldBackgroundColor.elevatedColor, | ||
| 338 | + darkColor: dynamicScaffoldBackgroundColor.darkElevatedColor, | ||
| 339 | + highContrastColor: | ||
| 340 | + dynamicScaffoldBackgroundColor.highContrastElevatedColor, | ||
| 341 | + darkHighContrastColor: | ||
| 342 | + dynamicScaffoldBackgroundColor.darkHighContrastElevatedColor, | ||
| 343 | + ); | ||
| 344 | + | ||
| 345 | + previousRouteTheme = previousRouteTheme.copyWith( | ||
| 346 | + scaffoldBackgroundColor: ColorTween( | ||
| 347 | + begin: systemBackground, | ||
| 348 | + end: elevatedScaffoldBackgroundColor.resolveFrom(context), | ||
| 349 | + ).evaluate(animation), | ||
| 350 | + primaryColor: CupertinoColors.placeholderText.resolveFrom(context), | ||
| 351 | + ); | ||
| 352 | + } | ||
| 353 | + | ||
| 354 | + if (cTheme.barBackgroundColor is CupertinoDynamicColor) { | ||
| 355 | + final dynamicBarBackgroundColor = | ||
| 356 | + cTheme.barBackgroundColor as CupertinoDynamicColor; | ||
| 357 | + | ||
| 358 | + /// NavigationBarColor for the previous route with forced using | ||
| 359 | + /// of the elevated colors | ||
| 360 | + final elevatedBarBackgroundColor = | ||
| 361 | + CupertinoDynamicColor.withBrightnessAndContrast( | ||
| 362 | + color: dynamicBarBackgroundColor.elevatedColor, | ||
| 363 | + darkColor: dynamicBarBackgroundColor.darkElevatedColor, | ||
| 364 | + highContrastColor: dynamicBarBackgroundColor.highContrastElevatedColor, | ||
| 365 | + darkHighContrastColor: | ||
| 366 | + dynamicBarBackgroundColor.darkHighContrastElevatedColor, | ||
| 367 | + ); | ||
| 368 | + | ||
| 369 | + previousRouteTheme = previousRouteTheme.copyWith( | ||
| 370 | + barBackgroundColor: ColorTween( | ||
| 371 | + begin: barBackgroundColor, | ||
| 372 | + end: elevatedBarBackgroundColor.resolveFrom(context), | ||
| 373 | + ).evaluate(animation), | ||
| 374 | + primaryColor: CupertinoColors.placeholderText.resolveFrom(context), | ||
| 375 | + ); | ||
| 376 | + } | ||
| 377 | + | ||
| 378 | + return previousRouteTheme; | ||
| 379 | + } | ||
| 284 | } | 380 | } |
| 285 | 381 | ||
| 286 | class _CupertinoScaffold extends InheritedWidget { | 382 | class _CupertinoScaffold extends InheritedWidget { |
-
Please register or login to post a comment