From c857f7e4215b6d01acd2724c0e49077f3ff8acc2 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Tue, 13 May 2025 21:41:43 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Make=20build=20widget?= =?UTF-8?q?=20method=20signatures=20consistent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/states/camera_picker_state.dart | 115 +++++++++++++++--------- 1 file changed, 74 insertions(+), 41 deletions(-) diff --git a/lib/src/states/camera_picker_state.dart b/lib/src/states/camera_picker_state.dart index 1144aad..889641f 100644 --- a/lib/src/states/camera_picker_state.dart +++ b/lib/src/states/camera_picker_state.dart @@ -1245,7 +1245,10 @@ class CameraPickerState extends State return const SizedBox.shrink(); } Widget backButton = buildBackButton(context); - Widget flashModeSwitch = buildFlashModeSwitch(context, v); + Widget flashModeSwitch = buildFlashModeSwitch( + context: context, + cameraValue: v, + ); if (isCameraRotated && !enableScaledPreview) { backButton = RotatedBox( quarterTurns: cameraQuarterTurns, @@ -1296,9 +1299,12 @@ class CameraPickerState extends State /// The button to switch flash modes. /// 切换闪光灯模式的按钮 - Widget buildFlashModeSwitch(BuildContext context, CameraValue value) { + Widget buildFlashModeSwitch({ + required BuildContext context, + required CameraValue cameraValue, + }) { final IconData icon; - switch (value.flashMode) { + switch (cameraValue.flashMode) { case FlashMode.off: icon = Icons.flash_off; break; @@ -1313,15 +1319,18 @@ class CameraPickerState extends State break; } return IconButton( - onPressed: () => switchFlashesMode(value), - tooltip: textDelegate.sFlashModeLabel(value.flashMode), + onPressed: () => switchFlashesMode(cameraValue), + tooltip: textDelegate.sFlashModeLabel(cameraValue.flashMode), icon: Icon(icon, size: 24), ); } /// Text widget for shooting tips. /// 拍摄的提示文字 - Widget buildCaptureTips(CameraController? controller) { + Widget buildCaptureTips({ + required BuildContext context, + CameraController? controller, + }) { return AnimatedOpacity( duration: recordDetectDuration, opacity: controller?.value.isRecordingVideo ?? false ? 0 : 1, @@ -1398,7 +1407,10 @@ class CameraPickerState extends State const Spacer(), Expanded( child: Center( - child: buildCaptureButton(context, constraints), + child: buildCaptureButton( + context: context, + constraints: constraints, + ), ), ), if (controller != null && @@ -1429,7 +1441,10 @@ class CameraPickerState extends State /// The shooting button. /// 拍照按钮 - Widget buildCaptureButton(BuildContext context, BoxConstraints constraints) { + Widget buildCaptureButton({ + required BuildContext context, + required BoxConstraints constraints, + }) { final showProgressIndicator = isCaptureButtonTapDown || MediaQuery.accessibleNavigationOf(context); @@ -1514,6 +1529,7 @@ class CameraPickerState extends State } Widget buildExposureSlider({ + required BuildContext context, required ExposureMode mode, required double size, required double height, @@ -1580,6 +1596,7 @@ class CameraPickerState extends State /// The area widget for the last exposure point that user manually set. /// 用户手动设置的曝光点的区域显示 Widget buildFocusingPoint({ + required BuildContext context, required CameraValue cameraValue, required BoxConstraints constraints, int quarterTurns = 0, @@ -1612,6 +1629,7 @@ class CameraPickerState extends State const SizedBox(height: verticalGap), Expanded( child: buildExposureSlider( + context: context, mode: exposureMode, size: size, height: height, @@ -1718,10 +1736,10 @@ class CameraPickerState extends State /// The [GestureDetector] widget for setting exposure point manually. /// 用于手动设置曝光点的 [GestureDetector] - Widget buildExposureDetector( - BuildContext context, - BoxConstraints constraints, - ) { + Widget buildExposureDetector({ + required BuildContext context, + required BoxConstraints constraints, + }) { return Semantics( label: textDelegate.sCameraPreviewLabel( innerController?.description.lensDirection, @@ -1812,8 +1830,9 @@ class CameraPickerState extends State children: [ preview, if (pickerConfig.enableSetExposure) - buildExposureDetector(context, constraints), + buildExposureDetector(context: context, constraints: constraints), buildFocusingPoint( + context: context, cameraValue: cameraValue, constraints: constraints, quarterTurns: cameraQuarterTurns, @@ -1865,11 +1884,11 @@ class CameraPickerState extends State ); } - Widget buildForegroundBody( - BuildContext context, - BoxConstraints constraints, + Widget buildForegroundBody({ + required BuildContext context, + required BoxConstraints constraints, DeviceOrientation? deviceOrientation, - ) { + }) { final orientation = deviceOrientation ?? MediaQuery.orientationOf(context); final isPortrait = orientation.toString().contains('portrait'); return SafeArea( @@ -1888,7 +1907,12 @@ class CameraPickerState extends State child: buildSettingActions(context), ), const Spacer(), - ExcludeSemantics(child: buildCaptureTips(innerController)), + ExcludeSemantics( + child: buildCaptureTips( + context: context, + controller: innerController, + ), + ), Semantics( sortKey: const OrdinalSortKey(2), hidden: innerController == null, @@ -1974,9 +1998,13 @@ class CameraPickerState extends State previewWidget, if (enableScaledPreview) ...[ if (pickerConfig.enableSetExposure) - buildExposureDetector(context, constraints), + buildExposureDetector( + context: context, + constraints: constraints, + ), buildInitializeWrapper( builder: (CameraValue v, _) => buildFocusingPoint( + context: context, cameraValue: v, constraints: constraints, ), @@ -1988,13 +2016,17 @@ class CameraPickerState extends State ), ], if (innerController == null) - buildForegroundBody(context, constraints, null) + buildForegroundBody( + context: context, + constraints: constraints, + deviceOrientation: null, + ) else buildInitializeWrapper( builder: (CameraValue v, _) => buildForegroundBody( - context, - constraints, - v.deviceOrientation, + context: context, + constraints: constraints, + deviceOrientation: v.deviceOrientation, ), ), ], @@ -2005,21 +2037,6 @@ class CameraPickerState extends State @override Widget build(BuildContext context) { - Widget body = Builder(builder: buildBody); - if (isCameraRotated && enableScaledPreview) { - final MediaQueryData mq = MediaQuery.of(context); - body = RotatedBox( - quarterTurns: pickerConfig.cameraQuarterTurns, - child: MediaQuery( - data: mq.copyWith( - size: pickerConfig.cameraQuarterTurns.isOdd - ? mq.size.flipped - : mq.size, - ), - child: body, - ), - ); - } return AnnotatedRegion( value: const SystemUiOverlayStyle( systemNavigationBarIconBrightness: Brightness.light, @@ -2028,9 +2045,25 @@ class CameraPickerState extends State ), child: Theme( data: theme, - child: Material( - color: Colors.black, - child: body, + child: Builder( + builder: (context) { + Widget body = buildBody(context); + if (isCameraRotated && enableScaledPreview) { + final MediaQueryData mq = MediaQuery.of(context); + body = RotatedBox( + quarterTurns: pickerConfig.cameraQuarterTurns, + child: MediaQuery( + data: mq.copyWith( + size: pickerConfig.cameraQuarterTurns.isOdd + ? mq.size.flipped + : mq.size, + ), + child: body, + ), + ); + } + return Material(color: Colors.black, child: body); + }, ), ), ); From 10ee5caa3df07e49ded98a5ae8303070ae74134f Mon Sep 17 00:00:00 2001 From: Alex Li Date: Tue, 13 May 2025 21:42:39 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=90=9B=20Make=20`ThemeData`=20properl?= =?UTF-8?q?y=20wraps=20the=20content?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/states/camera_picker_state.dart | 6 ++--- .../states/camera_picker_viewer_state.dart | 27 +++++++++++-------- lib/src/widgets/camera_focus_point.dart | 8 +++--- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lib/src/states/camera_picker_state.dart b/lib/src/states/camera_picker_state.dart index 889641f..5978f03 100644 --- a/lib/src/states/camera_picker_state.dart +++ b/lib/src/states/camera_picker_state.dart @@ -1515,7 +1515,7 @@ class CameraPickerState extends State showProgressIndicator && isShootingButtonAnimate, duration: pickerConfig.maximumRecordingDuration!, size: size, - ringsColor: theme.indicatorColor, + ringsColor: Theme.of(context).indicatorColor, ringsWidth: 3, ), ), @@ -1536,7 +1536,7 @@ class CameraPickerState extends State required double gap, }) { final bool isLocked = mode == ExposureMode.locked; - final Color? color = isLocked ? _lockedColor : theme.iconTheme.color; + final color = isLocked ? _lockedColor : Theme.of(context).iconTheme.color; final Widget lineWidget = ValueListenableBuilder( valueListenable: isFocusPointDisplays, builder: (_, bool value, Widget? child) => AnimatedOpacity( @@ -1716,7 +1716,7 @@ class CameraPickerState extends State size: pointWidth, color: cameraValue.exposureMode == ExposureMode.locked ? _lockedColor - : theme.iconTheme.color!, + : Theme.of(context).iconTheme.color, ), ), ), diff --git a/lib/src/states/camera_picker_viewer_state.dart b/lib/src/states/camera_picker_viewer_state.dart index c89f7a5..5bc5158 100644 --- a/lib/src/states/camera_picker_viewer_state.dart +++ b/lib/src/states/camera_picker_viewer_state.dart @@ -289,7 +289,7 @@ class CameraPickerViewerState extends State { minWidth: 20, height: 32, padding: const EdgeInsets.symmetric(horizontal: 20), - color: theme.colorScheme.secondary, + color: Theme.of(context).colorScheme.secondary, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(3), ), @@ -298,7 +298,7 @@ class CameraPickerViewerState extends State { child: Text( Singleton.textDelegate.confirm, style: TextStyle( - color: theme.textTheme.bodyLarge?.color, + color: Theme.of(context).textTheme.bodyLarge?.color, fontSize: 17, fontWeight: FontWeight.normal, ), @@ -402,15 +402,20 @@ class CameraPickerViewerState extends State { deletePreviewFileIfConfigured(); } }, - child: Material( - color: Colors.black, - child: Stack( - fit: StackFit.expand, - children: [ - buildPreview(context), - buildForeground(context), - if (isSavingEntity) buildLoading(context), - ], + child: Theme( + data: theme, + child: Builder( + builder: (context) => Material( + color: Colors.black, + child: Stack( + fit: StackFit.expand, + children: [ + buildPreview(context), + buildForeground(context), + if (isSavingEntity) buildLoading(context), + ], + ), + ), ), ), ); diff --git a/lib/src/widgets/camera_focus_point.dart b/lib/src/widgets/camera_focus_point.dart index c61a718..9cd758f 100644 --- a/lib/src/widgets/camera_focus_point.dart +++ b/lib/src/widgets/camera_focus_point.dart @@ -13,7 +13,7 @@ final class CameraFocusPoint extends StatelessWidget { }); final double size; - final Color color; + final Color? color; @override Widget build(BuildContext context) { @@ -51,7 +51,7 @@ final class CameraFocusPointPainter extends CustomPainter { final double size; final double radius; final double strokeWidth; - final Color color; + final Color? color; Radius get _circularRadius => Radius.circular(radius); @@ -61,8 +61,10 @@ final class CameraFocusPointPainter extends CustomPainter { final double lineLength = dividedSize.width - radius; final Paint paint = Paint() ..style = PaintingStyle.stroke - ..color = color ..strokeWidth = strokeWidth; + if (color != null) { + paint.color = color!; + } final Path path = Path() // Move to the start of the arc-line group at the left-top. From ced0fbe1679c7255daaa42e86795e796f5a2bb63 Mon Sep 17 00:00:00 2001 From: Alex Li Date: Tue, 13 May 2025 21:42:53 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=9A=A8=20Fix=20lints?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/src/states/camera_picker_state.dart | 1 + lib/src/widgets/camera_picker.dart | 1 + lib/src/widgets/camera_picker_viewer.dart | 2 ++ 3 files changed, 4 insertions(+) diff --git a/lib/src/states/camera_picker_state.dart b/lib/src/states/camera_picker_state.dart index 5978f03..d1c8e6c 100644 --- a/lib/src/states/camera_picker_state.dart +++ b/lib/src/states/camera_picker_state.dart @@ -1515,6 +1515,7 @@ class CameraPickerState extends State showProgressIndicator && isShootingButtonAnimate, duration: pickerConfig.maximumRecordingDuration!, size: size, + // ignore: deprecated_member_use ringsColor: Theme.of(context).indicatorColor, ringsWidth: 3, ), diff --git a/lib/src/widgets/camera_picker.dart b/lib/src/widgets/camera_picker.dart index 06bcf7b..f42659b 100644 --- a/lib/src/widgets/camera_picker.dart +++ b/lib/src/widgets/camera_picker.dart @@ -78,6 +78,7 @@ class CameraPicker extends StatefulWidget { selectionColor: themeColor.withAlpha(100), selectionHandleColor: themeColor, ), + // ignore: deprecated_member_use indicatorColor: themeColor, appBarTheme: const AppBarTheme( systemOverlayStyle: SystemUiOverlayStyle( diff --git a/lib/src/widgets/camera_picker_viewer.dart b/lib/src/widgets/camera_picker_viewer.dart index 62f1f4e..ad151f9 100644 --- a/lib/src/widgets/camera_picker_viewer.dart +++ b/lib/src/widgets/camera_picker_viewer.dart @@ -41,6 +41,7 @@ class CameraPickerViewer extends StatefulWidget { /// 跳转至选择预览的静态方法 static Future pushToViewer( BuildContext context, { + Key? key, required CameraPickerConfig pickerConfig, required CameraPickerViewType viewType, required XFile previewXFile, @@ -53,6 +54,7 @@ class CameraPickerViewer extends StatefulWidget { ).push( PageRouteBuilder( pageBuilder: (_, __, ___) => CameraPickerViewer._( + key: key, viewType: viewType, previewXFile: previewXFile, pickerConfig: pickerConfig,