switch back to old camera plugin #28

This commit is contained in:
otsmr 2025-03-17 00:06:38 +01:00
parent 644e5125d8
commit 9c027bd924
7 changed files with 393 additions and 457 deletions

View file

@ -1,3 +1,4 @@
import 'package:camera/camera.dart';
import 'package:twonly/src/database/twonly_database.dart'; import 'package:twonly/src/database/twonly_database.dart';
import 'package:twonly/src/providers/api_provider.dart'; import 'package:twonly/src/providers/api_provider.dart';
@ -5,3 +6,5 @@ late ApiProvider apiProvider;
// uses for background notification // uses for background notification
late TwonlyDatabase twonlyDatabase; late TwonlyDatabase twonlyDatabase;
List<CameraDescription> gCameras = <CameraDescription>[];

View file

@ -1,3 +1,4 @@
import 'package:camera/camera.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:twonly/globals.dart'; import 'package:twonly/globals.dart';
@ -37,6 +38,8 @@ void main() async {
await initMediaStorage(); await initMediaStorage();
await initFCMService(); await initFCMService();
gCameras = await availableCameras();
apiProvider = ApiProvider(); apiProvider = ApiProvider();
twonlyDatabase = TwonlyDatabase(); twonlyDatabase = TwonlyDatabase();

View file

@ -1,194 +1,108 @@
import 'package:camerawesome/camerawesome_plugin.dart'; import 'dart:math';
import 'package:camera/camera.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
class ZoomSelector extends StatefulWidget { class CameraZoomButtons extends StatefulWidget {
final CameraState state; const CameraZoomButtons(
{super.key,
required this.controller,
required this.updateScaleFactor,
required this.scaleFactor});
const ZoomSelector({ final CameraController controller;
super.key, final double scaleFactor;
required this.state, final Function updateScaleFactor;
});
@override @override
State<ZoomSelector> createState() => _ZoomSelectorState(); State<CameraZoomButtons> createState() => _CameraZoomButtonsState();
} }
class _ZoomSelectorState extends State<ZoomSelector> { String beautifulZoomScale(double scale) {
double? minZoom; var tmp = scale.toStringAsFixed(1);
double? maxZoom; if (tmp[0] == "0") {
tmp = tmp.substring(1, tmp.length);
@override }
void initState() { return tmp;
super.initState();
initAsync();
}
initAsync() async {
minZoom = await CamerawesomePlugin.getMinZoom();
maxZoom = await CamerawesomePlugin.getMaxZoom();
} }
class _CameraZoomButtonsState extends State<CameraZoomButtons> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return StreamBuilder<SensorConfig>( var zoomButtonStyle = TextButton.styleFrom(
stream: widget.state.sensorConfig$, padding: EdgeInsets.zero,
builder: (context, sensorConfigSnapshot) { foregroundColor: Colors.white,
initAsync(); minimumSize: Size(40, 40),
if (sensorConfigSnapshot.data == null || alignment: Alignment.center,
minZoom == null || tapTargetSize: MaterialTapTargetSize.shrinkWrap);
maxZoom == null) {
return const SizedBox.shrink();
}
return StreamBuilder<double>( final zoomTextStyle = TextStyle(fontSize: 13);
stream: sensorConfigSnapshot.requireData.zoom$, return Center(
builder: (context, snapshot) { child: ClipRRect(
if (snapshot.hasData) { borderRadius: BorderRadius.circular(40.0),
return _ZoomIndicatorLayout( child: Container(
zoom: snapshot.requireData, color: const Color.fromARGB(90, 0, 0, 0),
min: minZoom!, child: Row(
max: maxZoom!,
sensorConfig: widget.state.sensorConfig,
);
} else {
return const SizedBox.shrink();
}
},
);
},
);
}
}
class _ZoomIndicatorLayout extends StatelessWidget {
final double zoom;
final double min;
final double max;
final SensorConfig sensorConfig;
const _ZoomIndicatorLayout({
required this.zoom,
required this.min,
required this.max,
required this.sensorConfig,
});
@override
Widget build(BuildContext context) {
final displayZoom = (max - min) * zoom + min;
if (min == 1.0) {
return Container();
}
return Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
// Show 3 dots for zooming: min, 1.0X and max zoom. The closer one shows TextButton(
// text, the other ones a dot. style: zoomButtonStyle,
_ZoomIndicator( onPressed: () async {
normalValue: 0.0, var level = await widget.controller.getMinZoomLevel();
zoom: zoom, widget.updateScaleFactor(level);
selected: displayZoom < 1.0, },
min: min, child: FutureBuilder(
max: max, future: widget.controller.getMinZoomLevel(),
sensorConfig: sensorConfig, builder: (context, snap) {
), if (snap.hasData) {
Padding( var minLevel =
padding: const EdgeInsets.symmetric(horizontal: 8), beautifulZoomScale(snap.data!.toDouble());
child: _ZoomIndicator( var currentLevel =
normalValue: 0.5, beautifulZoomScale(widget.scaleFactor);
zoom: zoom, return Text(
selected: !(displayZoom < 1.0 || displayZoom == max), widget.scaleFactor < 1
min: min, ? "${currentLevel}x"
max: max, : "${minLevel}x",
sensorConfig: sensorConfig, style: zoomTextStyle,
),
),
_ZoomIndicator(
normalValue: 1.0,
zoom: zoom,
selected: displayZoom == max,
min: min,
max: max,
sensorConfig: sensorConfig,
),
],
); );
} else {
return Text("");
} }
} }),
),
class _ZoomIndicator extends StatelessWidget { TextButton(
final double zoom; style: zoomButtonStyle,
final double min; onPressed: () {
final double max; widget.updateScaleFactor(1.0);
final double normalValue;
final SensorConfig sensorConfig;
final bool selected;
const _ZoomIndicator({
required this.zoom,
required this.min,
required this.max,
required this.normalValue,
required this.sensorConfig,
required this.selected,
});
@override
Widget build(BuildContext context) {
final baseTheme = AwesomeThemeProvider.of(context).theme;
final baseButtonTheme = baseTheme.buttonTheme;
final displayZoom = (max - min) * zoom + min;
Widget content = AnimatedSwitcher(
duration: const Duration(milliseconds: 100),
transitionBuilder: (child, anim) {
return ScaleTransition(scale: anim, child: child);
}, },
child: selected
? AwesomeBouncingWidget(
key: ValueKey("zoomIndicator_${normalValue}_selected"),
onTap: () {
sensorConfig.setZoom(normalValue);
},
child: Container(
color: Colors.transparent,
padding: const EdgeInsets.all(0.0),
child: AwesomeCircleWidget(
theme: baseTheme,
child: Text( child: Text(
"${displayZoom.toStringAsFixed(1)}X", (widget.scaleFactor >= 1 && widget.scaleFactor < 2)
style: const TextStyle(color: Colors.white, fontSize: 12), ? "${beautifulZoomScale(widget.scaleFactor)}x"
), : "1.0x",
), style: zoomTextStyle,
), )),
) TextButton(
: AwesomeBouncingWidget( style: zoomButtonStyle,
key: ValueKey("zoomIndicator_${normalValue}_unselected"), onPressed: () async {
onTap: () { var level = min(await widget.controller.getMaxZoomLevel(), 2)
sensorConfig.setZoom(normalValue); .toDouble();
widget.updateScaleFactor(level);
}, },
child: Container( child: FutureBuilder(
color: Colors.transparent, future: widget.controller.getMaxZoomLevel(),
padding: const EdgeInsets.all(16.0), builder: (context, snap) {
child: AwesomeCircleWidget( if (snap.hasData) {
theme: baseTheme.copyWith( var maxLevel = min((snap.data?.toInt())!, 2);
buttonTheme: baseButtonTheme.copyWith( return Text("${maxLevel}x", style: zoomTextStyle);
backgroundColor: baseButtonTheme.foregroundColor, } else {
padding: EdgeInsets.zero, return Text("");
), }
), }),
child: const SizedBox(width: 6, height: 6), )
],
), ),
), ),
), ),
); );
// Same width for each dot to keep them in their position
return SizedBox(
width: 56,
child: Center(
child: content,
),
);
} }
} }

View file

@ -1,9 +1,9 @@
import 'dart:io'; import 'dart:typed_data';
import 'dart:ui'; import 'package:camera/camera.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:camerawesome/camerawesome_plugin.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:path_provider/path_provider.dart'; import 'package:screenshot/screenshot.dart';
import 'package:twonly/globals.dart';
import 'package:twonly/src/components/zoom_selector.dart'; import 'package:twonly/src/components/zoom_selector.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/components/image_editor/action_button.dart'; import 'package:twonly/src/components/image_editor/action_button.dart';
@ -48,13 +48,77 @@ class CameraPreviewView extends StatefulWidget {
} }
class _CameraPreviewViewState extends State<CameraPreviewView> { class _CameraPreviewViewState extends State<CameraPreviewView> {
double _lastZoom = 1; double scaleFactor = 1;
double _basePanY = 0;
bool sharePreviewIsShown = false; bool sharePreviewIsShown = false;
bool isFlashOn = false; bool isFlashOn = false;
bool showSelfieFlash = false; bool showSelfieFlash = false;
int cameraId = 0;
bool isZoomAble = false;
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
late CameraController controller;
ScreenshotController screenshotController = ScreenshotController();
@override
void initState() {
super.initState();
selectCamera(0, init: true);
}
void selectCamera(int sCameraId, {bool init = false}) {
if (sCameraId > gCameras.length) return;
setState(() {
isZoomAble = false;
});
controller = CameraController(gCameras[sCameraId], ResolutionPreset.high);
controller.initialize().then((_) async {
if (!mounted) {
return;
}
controller.setFlashMode(isFlashOn ? FlashMode.always : FlashMode.off);
isZoomAble = await controller.getMinZoomLevel() !=
await controller.getMaxZoomLevel();
setState(() {});
}).catchError((Object e) {
if (e is CameraException) {
switch (e.code) {
case 'CameraAccessDenied':
// Handle access errors here.
break;
default:
// Handle other errors here.
break;
}
}
});
setState(() {
cameraId = sCameraId;
});
}
Future<void> updateScaleFactor(double newScale) async {
var minFactor = await controller.getMinZoomLevel();
var maxFactor = await controller.getMaxZoomLevel();
if (newScale < minFactor) {
newScale = minFactor;
}
if (newScale > maxFactor) {
newScale = maxFactor;
}
await controller.setZoomLevel(newScale);
setState(() {
scaleFactor = newScale;
});
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MediaViewSizing( return MediaViewSizing(
@ -62,117 +126,57 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
children: [ children: [
ClipRRect( ClipRRect(
borderRadius: BorderRadius.circular(22), borderRadius: BorderRadius.circular(22),
child: CameraAwesomeBuilder.custom( child: Stack(
previewAlignment: Alignment.topLeft,
sensorConfig: SensorConfig.single(
aspectRatio: CameraAspectRatios.ratio_16_9,
zoom: 0.5,
),
previewFit: CameraPreviewFit.contain,
progressIndicator: Container(),
onMediaCaptureEvent: (event) {
switch ((event.status, event.isPicture, event.isVideo)) {
case (MediaCaptureStatus.capturing, true, false):
debugPrint('Capturing picture...');
case (MediaCaptureStatus.success, true, false):
event.captureRequest.when(
single: (single) async {
final imageBytes = await single.file?.readAsBytes();
if (imageBytes == null || !context.mounted) return;
debugPrint("Delete ${single.path!}");
File(single.path!).delete();
setState(() {
sharePreviewIsShown = true;
});
await Navigator.push(
context,
PageRouteBuilder(
opaque: false,
pageBuilder: (context, a1, a2) =>
ShareImageEditorView(imageBytes: imageBytes),
transitionsBuilder: (context, animation,
secondaryAnimation, child) {
return child;
},
transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero,
),
);
if (context.mounted) {
setState(() {
sharePreviewIsShown = false;
});
}
},
multiple: (multiple) {
multiple.fileBySensor.forEach((key, value) {
debugPrint(
'multiple image taken: $key ${value?.path}');
});
},
);
case (MediaCaptureStatus.failure, true, false):
debugPrint('Failed to capture picture: ${event.exception}');
case (MediaCaptureStatus.capturing, false, true):
debugPrint('Capturing video...');
case (MediaCaptureStatus.success, false, true):
event.captureRequest.when(
single: (single) {
debugPrint('Video saved: ${single.file?.path}');
},
multiple: (multiple) {
multiple.fileBySensor.forEach((key, value) {
debugPrint(
'multiple video taken: $key ${value?.path}');
});
},
);
case (MediaCaptureStatus.failure, false, true):
debugPrint('Failed to capture video: ${event.exception}');
default:
debugPrint('Unknown event: $event');
}
},
builder: (cameraState, preview) {
return Stack(
children: [ children: [
(controller.value.isInitialized)
? Positioned.fill(
child: Screenshot(
controller: screenshotController,
child: AspectRatio(
aspectRatio: 9 / 16,
child: ClipRect(
child: FittedBox(
fit: BoxFit.cover,
child: SizedBox(
width: controller.value.previewSize!.height,
height: controller.value.previewSize!.width,
child: CameraPreview(controller),
),
),
),
)),
)
: Container(),
Positioned.fill( Positioned.fill(
child: GestureDetector( child: GestureDetector(
onPanStart: (details) async { onPanStart: (details) async {
if (cameraState.sensorConfig.sensors.first.position == // if (cameraState.sensorConfig.sensors.first.position ==
SensorPosition.front) { // SensorPosition.front) {
return; // return;
} // }
setState(() { // setState(() {
_basePanY = details.localPosition.dy; // _basePanY = details.localPosition.dy;
}); // });
}, },
onPanUpdate: (details) async { onPanUpdate: (details) async {
if (cameraState.sensorConfig.sensors.first.position == // if (cameraState.sensorConfig.sensors.first.position ==
SensorPosition.front) { // SensorPosition.front) {
return; // return;
} // }
var diff = _basePanY - details.localPosition.dy; // var diff = _basePanY - details.localPosition.dy;
if (diff > 200) diff = 200; // if (diff > 200) diff = 200;
if (diff < 0) diff = 0; // if (diff < 0) diff = 0;
var tmp = (diff / 200 * 50).toInt() / 50; // var tmp = (diff / 200 * 50).toInt() / 50;
if (tmp != _lastZoom) { // if (tmp != _lastZoom) {
cameraState.sensorConfig.setZoom(tmp); // cameraState.sensorConfig.setZoom(tmp);
setState(() { // setState(() {
(tmp); // (tmp);
_lastZoom = tmp; // _lastZoom = tmp;
}); // });
} // }
}, },
onDoubleTap: () async { onDoubleTap: () async {
bool isFront = selectCamera((cameraId + 1) % 2);
cameraState.sensorConfig.sensors.first.position ==
SensorPosition.front;
cameraState.switchCameraSensor(
aspectRatio: CameraAspectRatios.ratio_16_9,
flash: isFlashOn ? FlashMode.on : FlashMode.none,
zoom: isFront ? 0.5 : 0,
);
}, },
), ),
), ),
@ -192,13 +196,7 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
tooltipText: tooltipText:
context.lang.switchFrontAndBackCamera, context.lang.switchFrontAndBackCamera,
onPressed: () async { onPressed: () async {
cameraState.switchCameraSensor( selectCamera((cameraId + 1) % 2);
aspectRatio:
CameraAspectRatios.ratio_16_9,
flash: isFlashOn
? FlashMode.on
: FlashMode.none,
);
}, },
), ),
ActionButton( ActionButton(
@ -206,16 +204,13 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
tooltipText: context.lang.toggleFlashLight, tooltipText: context.lang.toggleFlashLight,
color: isFlashOn color: isFlashOn
? const Color.fromARGB(255, 255, 230, 0) ? const Color.fromARGB(255, 255, 230, 0)
: const Color.fromARGB( : const Color.fromARGB(158, 255, 255, 255),
158, 255, 255, 255),
onPressed: () async { onPressed: () async {
if (isFlashOn) { if (isFlashOn) {
cameraState.sensorConfig controller.setFlashMode(FlashMode.off);
.setFlashMode(FlashMode.none);
isFlashOn = false; isFlashOn = false;
} else { } else {
cameraState.sensorConfig controller.setFlashMode(FlashMode.always);
.setFlashMode(FlashMode.on);
isFlashOn = true; isFlashOn = true;
} }
setState(() {}); setState(() {});
@ -235,24 +230,71 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
child: Column( child: Column(
children: [ children: [
ZoomSelector(state: cameraState), if (controller.value.isInitialized &&
isZoomAble &&
controller.description.lensDirection !=
CameraLensDirection.front)
SizedBox(
width: 150,
child: CameraZoomButtons(
key: widget.key,
scaleFactor: scaleFactor,
updateScaleFactor: updateScaleFactor,
controller: controller,
),
),
const SizedBox(height: 30), const SizedBox(height: 30),
GestureDetector( GestureDetector(
onTap: () async { onTap: () async {
if (cameraState.sensorConfig.flashMode == if (isFlashOn) {
FlashMode.on && if (controller.description.lensDirection ==
cameraState.sensorConfig.sensors.first CameraLensDirection.front) {
.position ==
SensorPosition.front) {
setState(() { setState(() {
showSelfieFlash = true; showSelfieFlash = true;
}); });
await Future.delayed( } else {
Duration(milliseconds: 500)); controller.setFlashMode(FlashMode.torch);
} }
cameraState.when( await Future.delayed(
onPhotoMode: (picState) => Duration(milliseconds: 1000));
picState.takePhoto()); }
await controller.pausePreview();
if (!context.mounted) return;
controller.setFlashMode(
isFlashOn ? FlashMode.always : FlashMode.off);
Future<Uint8List?> imageBytes =
screenshotController.capture(pixelRatio: 1);
setState(() {
sharePreviewIsShown = true;
});
await Navigator.push(
context,
PageRouteBuilder(
opaque: false,
pageBuilder: (context, a1, a2) =>
ShareImageEditorView(
imageBytes: imageBytes),
transitionsBuilder: (context, animation,
secondaryAnimation, child) {
return child;
},
transitionDuration: Duration.zero,
reverseTransitionDuration: Duration.zero,
),
);
// does not work??
//await controller.resumePreview();
selectCamera(0);
if (context.mounted) {
setState(() {
sharePreviewIsShown = false;
});
}
setState(() { setState(() {
showSelfieFlash = false; showSelfieFlash = false;
}); });
@ -280,19 +322,6 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
), ),
), ),
], ],
);
},
saveConfig: SaveConfig.photoAndVideo(
photoPathBuilder: (sensors) async {
final Directory extDir = await getTemporaryDirectory();
final testDir = await Directory(
'${extDir.path}/images',
).create(recursive: true);
final String filePath =
'${testDir.path}/${DateTime.now().millisecondsSinceEpoch}.jpg';
return SingleCaptureRequest(filePath, sensors.first);
},
),
), ),
), ),
if (showSelfieFlash) if (showSelfieFlash)
@ -304,18 +333,6 @@ class _CameraPreviewViewState extends State<CameraPreviewView> {
), ),
), ),
), ),
if (sharePreviewIsShown)
Positioned.fill(
child: BackdropFilter(
filter: ImageFilter.blur(
sigmaX: 100.0,
sigmaY: 100.0,
),
child: Center(
child: CircularProgressIndicator(),
),
),
)
], ],
), ),
); );

View file

@ -26,7 +26,7 @@ List<Layer> removedLayers = [];
class ShareImageEditorView extends StatefulWidget { class ShareImageEditorView extends StatefulWidget {
const ShareImageEditorView({super.key, required this.imageBytes}); const ShareImageEditorView({super.key, required this.imageBytes});
final Uint8List imageBytes; final Future<Uint8List?> imageBytes;
@override @override
State<ShareImageEditorView> createState() => _ShareImageEditorView(); State<ShareImageEditorView> createState() => _ShareImageEditorView();
} }
@ -223,8 +223,9 @@ class _ShareImageEditorView extends State<ShareImageEditorView> {
return image; return image;
} }
Future<void> loadImage(dynamic imageFile) async { Future<void> loadImage(Future<Uint8List?> imageFile) async {
await currentImage.load(imageFile); Uint8List? imageBytes = await imageFile;
await currentImage.load(imageBytes);
layers.clear(); layers.clear();

View file

@ -129,22 +129,46 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.9.3" version: "8.9.3"
camerawesome: camera:
dependency: "direct main" dependency: "direct main"
description: description:
name: camerawesome name: camera
sha256: "3619d5605fb14ab72c815532c1d9f635512c75df07b5a742b60a9a4b03b6081e" sha256: "413d2b34fe28496c35c69ede5b232fb9dd5ca2c3a4cb606b14efc1c7546cc8cb"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.0" version: "0.11.1"
carousel_slider: camera_android_camerax:
dependency: transitive dependency: transitive
description: description:
name: carousel_slider name: camera_android_camerax
sha256: "7b006ec356205054af5beaef62e2221160ea36b90fb70a35e4deacd49d0349ae" sha256: "13784f539c7f104766bff84e4479a70f03b29d78b208278be45c939250d9d7f5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.0" version: "0.6.14+1"
camera_avfoundation:
dependency: transitive
description:
name: camera_avfoundation
sha256: "3057ada0b30402e3a9b6dffec365c9736a36edbf04abaecc67c4309eadc86b49"
url: "https://pub.dev"
source: hosted
version: "0.9.18+9"
camera_platform_interface:
dependency: transitive
description:
name: camera_platform_interface
sha256: "953e7baed3a7c8fae92f7200afeb2be503ff1a17c3b4e4ed7b76f008c2810a31"
url: "https://pub.dev"
source: hosted
version: "2.9.0"
camera_web:
dependency: transitive
description:
name: camera_web
sha256: "595f28c89d1fb62d77c73c633193755b781c6d2e0ebcd8dc25b763b514e6ba8f"
url: "https://pub.dev"
source: hosted
version: "0.3.5"
characters: characters:
dependency: transitive dependency: transitive
description: description:
@ -201,14 +225,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.19.0" version: "1.19.0"
colorfilter_generator:
dependency: transitive
description:
name: colorfilter_generator
sha256: ccc2995e440b1d828d55d99150e7cad64624f3cb4a1e235000de3f93cf10d35c
url: "https://pub.dev"
source: hosted
version: "0.0.8"
connectivity_plus: connectivity_plus:
dependency: "direct main" dependency: "direct main"
description: description:
@ -869,14 +885,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.11.1" version: "0.11.1"
matrix2d:
dependency: transitive
description:
name: matrix2d
sha256: "188718dd3bc2a31e372cfd0791b0f77f4f13ea76164147342cc378d9132949e7"
url: "https://pub.dev"
source: hosted
version: "1.0.4"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@ -1173,14 +1181,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.2" version: "1.3.2"
rxdart:
dependency: transitive
description:
name: rxdart
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
url: "https://pub.dev"
source: hosted
version: "0.28.0"
screenshot: screenshot:
dependency: "direct main" dependency: "direct main"
description: description:

View file

@ -10,9 +10,6 @@ environment:
sdk: ^3.6.0 sdk: ^3.6.0
dependencies: dependencies:
camerawesome: ^2.1.0
# camerawesome:
# path: ../CamerAwesome
collection: ^1.18.0 collection: ^1.18.0
connectivity_plus: ^6.1.2 connectivity_plus: ^6.1.2
drift: ^2.25.1 drift: ^2.25.1
@ -54,6 +51,7 @@ dependencies:
screenshot: ^3.0.0 screenshot: ^3.0.0
url_launcher: ^6.3.1 url_launcher: ^6.3.1
web_socket_channel: ^3.0.1 web_socket_channel: ^3.0.1
camera: ^0.11.1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: