179 lines
4.3 KiB
Dart
179 lines
4.3 KiB
Dart
import 'package:ai_barcode/ai_barcode.dart';
|
|
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:permission_handler/permission_handler.dart';
|
|
|
|
late String _label;
|
|
late Function(String result) _resultCallback;
|
|
|
|
///
|
|
/// AppBarcodeScannerWidget
|
|
class AppBarcodeScannerWidget extends StatefulWidget {
|
|
///
|
|
///
|
|
AppBarcodeScannerWidget.defaultStyle({
|
|
Function(String result)? resultCallback,
|
|
String label = 'Заголовок',
|
|
}) {
|
|
_resultCallback = resultCallback ?? (String result) {};
|
|
_label = label;
|
|
}
|
|
|
|
@override
|
|
_AppBarcodeState createState() => _AppBarcodeState();
|
|
}
|
|
|
|
class _AppBarcodeState extends State<AppBarcodeScannerWidget> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return _BarcodePermissionWidget();
|
|
}
|
|
}
|
|
|
|
class _BarcodePermissionWidget extends StatefulWidget {
|
|
@override
|
|
State<StatefulWidget> createState() {
|
|
return _BarcodePermissionWidgetState();
|
|
}
|
|
}
|
|
|
|
class _BarcodePermissionWidgetState extends State<_BarcodePermissionWidget> {
|
|
bool _isGranted = false;
|
|
|
|
bool _useCameraScan = true;
|
|
|
|
String _inputValue = "";
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
}
|
|
|
|
void _requestMobilePermission() async {
|
|
if (await Permission.camera.request().isGranted) {
|
|
setState(() {
|
|
_isGranted = true;
|
|
});
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
TargetPlatform platform = Theme.of(context).platform;
|
|
if (!kIsWeb) {
|
|
if (platform == TargetPlatform.android ||
|
|
platform == TargetPlatform.iOS) {
|
|
_requestMobilePermission();
|
|
} else {
|
|
setState(() {
|
|
_isGranted = true;
|
|
});
|
|
}
|
|
} else {
|
|
setState(() {
|
|
_isGranted = true;
|
|
});
|
|
}
|
|
|
|
return Column(
|
|
children: <Widget>[
|
|
Expanded(
|
|
child: _isGranted
|
|
? _BarcodeScannerWidget()
|
|
: Center(
|
|
child: OutlinedButton(
|
|
onPressed: () {
|
|
_requestMobilePermission();
|
|
},
|
|
child: const Text('Запроса на разрешения'),
|
|
),
|
|
),
|
|
),
|
|
// _useCameraScan
|
|
// ? OutlinedButton(
|
|
// onPressed: () {
|
|
// setState(() {
|
|
// _useCameraScan = false;
|
|
// });
|
|
// },
|
|
// child: Text("Использовать камеру $_label"),
|
|
// )
|
|
// : Row(
|
|
// children: [
|
|
// OutlineButton(
|
|
// onPressed: () {
|
|
// setState(() {
|
|
// _useCameraScan = true;
|
|
// });
|
|
// },
|
|
// child: Text("_useCameraScan = true $_label"),
|
|
// ),
|
|
// OutlineButton(
|
|
// onPressed: () {
|
|
// _resultCallback(_inputValue);
|
|
// },
|
|
// child: Text("_resultCallback"),
|
|
// ),
|
|
// ],
|
|
// ),
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
///ScannerWidget
|
|
class _BarcodeScannerWidget extends StatefulWidget {
|
|
@override
|
|
State<StatefulWidget> createState() {
|
|
return _AppBarcodeScannerWidgetState();
|
|
}
|
|
}
|
|
|
|
class _AppBarcodeScannerWidgetState extends State<_BarcodeScannerWidget> {
|
|
late ScannerController _scannerController;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
_scannerController = ScannerController(scannerResult: (result) {
|
|
_resultCallback(result);
|
|
}, scannerViewCreated: () {
|
|
TargetPlatform platform = Theme.of(context).platform;
|
|
if (TargetPlatform.iOS == platform) {
|
|
Future.delayed(Duration(seconds: 2), () {
|
|
_scannerController.startCamera();
|
|
_scannerController.startCameraPreview();
|
|
});
|
|
} else {
|
|
_scannerController.startCamera();
|
|
_scannerController.startCameraPreview();
|
|
}
|
|
});
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
super.dispose();
|
|
_scannerController.stopCameraPreview();
|
|
_scannerController.stopCamera();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Column(
|
|
children: <Widget>[
|
|
Expanded(
|
|
child: _getScanWidgetByPlatform(),
|
|
)
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget _getScanWidgetByPlatform() {
|
|
return PlatformAiBarcodeScannerWidget(
|
|
platformScannerController: _scannerController,
|
|
);
|
|
}
|
|
} |