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.
162 lines
5.8 KiB
162 lines
5.8 KiB
import 'package:flutter/material.dart';
|
|
import 'package:mobile_scanner/mobile_scanner.dart';
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
import 'package:flutter_sms/flutter_sms.dart';
|
|
|
|
void main() {
|
|
runApp(const AnalyzeView());
|
|
}
|
|
|
|
class AnalyzeView extends StatefulWidget {
|
|
const AnalyzeView({Key? key}) : super(key: key);
|
|
|
|
@override
|
|
_AnalyzeViewState createState() => _AnalyzeViewState();
|
|
}
|
|
|
|
class _AnalyzeViewState extends State<AnalyzeView>
|
|
with SingleTickerProviderStateMixin {
|
|
String? barcode;
|
|
|
|
MobileScannerController controller = MobileScannerController(
|
|
torchEnabled: false,
|
|
facing: CameraFacing.back,
|
|
);
|
|
|
|
void launchURL(String url) async {
|
|
if (!await launch(url)) throw 'Could not launch $url';
|
|
}
|
|
|
|
void _sendSMS(String message, List<String> recipents) async {
|
|
String _result = await sendSMS(message: message, recipients: recipents)
|
|
.catchError((onError) {
|
|
print('sms err: $onError');
|
|
});
|
|
print('sms res: $_result');
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
home: Scaffold(
|
|
backgroundColor: Colors.black,
|
|
body: Builder(builder: (context) {
|
|
return Stack(
|
|
children: [
|
|
MobileScanner(
|
|
controller: controller,
|
|
fit: BoxFit.contain,
|
|
// controller: MobileScannerController(
|
|
// torchEnabled: true,
|
|
// facing: CameraFacing.front,
|
|
// ),
|
|
onDetect: (barcode, args) {
|
|
if (this.barcode != barcode.rawValue) {
|
|
setState(() {
|
|
this.barcode = barcode.rawValue;
|
|
});
|
|
if (barcode.rawValue.startsWith('smsto')) {
|
|
//launchURL(barcode.rawValue);
|
|
List<String> recipents = ["0926381229"];
|
|
_sendSMS(barcode.rawValue, recipents);
|
|
}
|
|
}
|
|
}),
|
|
Align(
|
|
alignment: Alignment.bottomCenter,
|
|
child: Container(
|
|
alignment: Alignment.bottomCenter,
|
|
height: 100,
|
|
color: Colors.black.withOpacity(0.4),
|
|
child: Row(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
children: [
|
|
IconButton(
|
|
color: Colors.white,
|
|
icon: ValueListenableBuilder(
|
|
valueListenable: controller.torchState,
|
|
builder: (context, state, child) {
|
|
switch (state as TorchState) {
|
|
case TorchState.off:
|
|
return const Icon(Icons.flash_off,
|
|
color: Colors.grey);
|
|
case TorchState.on:
|
|
return const Icon(Icons.flash_on,
|
|
color: Colors.yellow);
|
|
}
|
|
},
|
|
),
|
|
iconSize: 32.0,
|
|
onPressed: () => controller.toggleTorch(),
|
|
),
|
|
Center(
|
|
child: SizedBox(
|
|
width: MediaQuery.of(context).size.width - 120,
|
|
height: 50,
|
|
child: FittedBox(
|
|
child: Text(
|
|
barcode ?? 'Scan something!',
|
|
overflow: TextOverflow.fade,
|
|
style: Theme.of(context)
|
|
.textTheme
|
|
.headline4!
|
|
.copyWith(color: Colors.white),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
IconButton(
|
|
color: Colors.white,
|
|
icon: ValueListenableBuilder(
|
|
valueListenable: controller.cameraFacingState,
|
|
builder: (context, state, child) {
|
|
switch (state as CameraFacing) {
|
|
case CameraFacing.front:
|
|
return const Icon(Icons.camera_front);
|
|
case CameraFacing.back:
|
|
return const Icon(Icons.camera_rear);
|
|
}
|
|
},
|
|
),
|
|
iconSize: 32.0,
|
|
onPressed: () => controller.switchCamera(),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
|
|
// Container(
|
|
// alignment: Alignment.bottomCenter,
|
|
// margin: EdgeInsets.only(bottom: 80.0),
|
|
// child: IconButton(
|
|
// icon: ValueListenableBuilder(
|
|
// valueListenable: cameraController.torchState,
|
|
// builder: (context, state, child) {
|
|
// final color =
|
|
// state == TorchState.off ? Colors.grey : Colors.white;
|
|
// return Icon(Icons.bolt, color: color);
|
|
// },
|
|
// ),
|
|
// iconSize: 32.0,
|
|
// onPressed: () => cameraController.torch(),
|
|
// ),
|
|
// ),
|
|
],
|
|
);
|
|
}),
|
|
),
|
|
);
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
// cameraController.dispose();
|
|
super.dispose();
|
|
}
|
|
|
|
void display(Barcode barcode) {
|
|
Navigator.of(context).popAndPushNamed('display', arguments: barcode);
|
|
}
|
|
}
|
|
|