Этот репозиторий содержит Flutter плагины для платформы ОС Аврора.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

153 lines
5.8 KiB

// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'dart:async';
import 'dart:io';
import 'package:camera/camera.dart';
import 'package:camera_aurora/camera_aurora.dart';
import 'package:flutter/material.dart';
import 'package:flutter_example_packages/base/di/app_di.dart';
import 'package:flutter_example_packages/base/package/package.dart';
import 'package:flutter_example_packages/packages/camera/extension/export.dart';
import 'package:flutter_example_packages/packages/camera/widgets/camera_body.dart';
import 'package:flutter_example_packages/packages/camera/widgets/camera_control_panel.dart';
import 'package:flutter_example_packages/packages/camera/widgets/cameras_loading.dart';
import 'package:flutter_example_packages/packages/camera/widgets/cameras_select.dart';
import 'package:flutter_example_packages/theme/colors.dart';
import 'package:flutter_example_packages/widgets/base/export.dart';
import 'package:flutter_example_packages/widgets/layouts/block_layout.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'model.dart';
import 'package.dart';
class CameraPage extends AppStatefulWidget {
CameraPage({
super.key,
});
final Package package = packageCamera;
@override
State<CameraPage> createState() => _CameraPageState();
}
class _CameraPageState extends AppState<CameraPage> {
CameraController? _cameraController;
File? _photo;
bool _loading = false;
StreamSubscription<String?>? _cameraSearchQrSubscription;
@override
Widget buildWide(
BuildContext context,
MediaQueryData media,
AppLocalizations l10n,
) {
return BlockLayout<CameraModel>(
model: getIt<CameraModel>(),
title: widget.package.key,
builder: (context, child, model) {
return Padding(
padding: const EdgeInsets.all(20),
child: CamerasLoading(
package: widget.package,
builder: (context, cameras) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Flexible(
flex: 1,
child: Column(
children: [
Flexible(
flex: 0,
child: CamerasSelect(
disable: _loading,
cameras: cameras,
onChange: (controller) => setState(() {
_photo = null;
_cameraController = controller;
}),
),
),
const SizedBox(height: 5),
Flexible(
flex: 1,
child: CameraBody(
loading: _loading,
controller: _cameraController,
photo: _photo,
),
),
CameraControlPanel(
isStartQr: _cameraSearchQrSubscription != null,
disable: _loading,
controller: _cameraController,
photo: _photo,
// Start search qr
onStartQr: () => setState(() {
_cameraSearchQrSubscription =
cameraSearchQr?.listen((text) {
if (mounted) {
_cameraSearchQrSubscription?.cancel();
setState(() {
showMessage(
"Read QR: $text", Colors.greenAccent);
_cameraSearchQrSubscription = null;
});
}
});
}),
// Stop search qr
onStopQr: () => setState(() {
_cameraSearchQrSubscription?.cancel();
_cameraSearchQrSubscription = null;
}),
// Take photo and save to file (custom extension)
onTakePhoto: () => setState(() {
_loading = true;
_cameraController?.takeImageFile().then((photo) {
if (mounted) {
if (photo != null) {
showMessage("File save to: ${photo.path}",
AppColors.secondary);
} else {
showMessage(
"Error save file", Colors.redAccent);
}
setState(() {
_loading = false;
_photo = photo;
});
}
});
}),
// Clear photo
onClearPhoto: () {
if (mounted) {
setState(() {
_photo = null;
});
}
},
),
],
),
),
],
);
},
),
);
},
);
}
void showMessage(String text, Color color) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(text),
backgroundColor: color,
));
}
}