Flutter plugin for scanning and generating QR codes using the ZXing library, supporting Android, iOS, and desktop platforms
flutterbarcode-generatorbarcode-scannergeneratorqrqrcodeqrcode-generatorqrcode-scannerscannerzxingbarcodezxscanner
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.
127 lines
3.5 KiB
127 lines
3.5 KiB
import 'dart:io'; |
|
import 'dart:typed_data'; |
|
|
|
import 'package:flutter/material.dart'; |
|
import 'package:flutter_zxing/flutter_zxing.dart'; |
|
import 'package:path_provider/path_provider.dart'; |
|
import 'package:share_plus/share_plus.dart'; |
|
|
|
import '../configs/constants.dart'; |
|
import '../models/encode.dart' as model; |
|
import '../utils/db_service.dart'; |
|
import '../utils/extensions.dart'; |
|
import '../widgets/common_widgets.dart'; |
|
|
|
late Directory tempDir; |
|
String get tempPath => '${tempDir.path}/zxing.jpg'; |
|
|
|
class CreatorPage extends StatefulWidget { |
|
const CreatorPage({ |
|
super.key, |
|
}); |
|
|
|
@override |
|
State<CreatorPage> createState() => _CreatorPageState(); |
|
} |
|
|
|
class _CreatorPageState extends State<CreatorPage> { |
|
bool isAndroid() => Theme.of(context).platform == TargetPlatform.android; |
|
|
|
// Write result |
|
model.Encode? encode; |
|
|
|
@override |
|
void initState() { |
|
super.initState(); |
|
|
|
initStateAsync(); |
|
} |
|
|
|
Future<void> initStateAsync() async { |
|
getTemporaryDirectory().then((Directory value) { |
|
tempDir = value; |
|
}); |
|
} |
|
|
|
@override |
|
Widget build(BuildContext context) { |
|
return Scaffold( |
|
appBar: AppBar( |
|
title: const Text('Creator'), |
|
), |
|
body: SingleChildScrollView( |
|
child: ContainerX( |
|
child: Column( |
|
children: <Widget>[ |
|
WriterWidget( |
|
onSuccess: (Encode result, Uint8List? bytes) { |
|
setState(() { |
|
encode = model.Encode.fromEncodeResult(result, bytes); |
|
}); |
|
}, |
|
onError: (String error) { |
|
setState(() { |
|
encode = null; |
|
}); |
|
context.showToast(error); |
|
}, |
|
), |
|
if (encode != null) buildWriteResult(), |
|
], |
|
), |
|
), |
|
), |
|
); |
|
} |
|
|
|
Column buildWriteResult() { |
|
return Column( |
|
children: <Widget>[ |
|
// Barcode image |
|
if (encode?.data != null) Image.memory(encode?.data ?? Uint8List(0)), |
|
const SizedBox(height: spaceLarge), |
|
// Share button |
|
Row( |
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly, |
|
children: <Widget>[ |
|
Builder(builder: (BuildContext context) { |
|
return ElevatedButton( |
|
onPressed: () { |
|
// Save image to device |
|
final File file = File(tempPath); |
|
file.writeAsBytesSync(encode?.data ?? Uint8List(0)); |
|
final String path = file.path; |
|
|
|
// Share image |
|
final RenderBox? box = |
|
context.findRenderObject() as RenderBox?; |
|
if (box != null) { |
|
Share.shareXFiles( |
|
<XFile>[XFile(path)], |
|
sharePositionOrigin: |
|
box.localToGlobal(Offset.zero) & box.size, |
|
); |
|
} |
|
}, |
|
child: const Text('Share'), |
|
); |
|
}), |
|
ElevatedButton( |
|
onPressed: () async { |
|
if (encode != null) { |
|
await DbService.instance.addEncode(encode!); |
|
if (!mounted) { |
|
return; |
|
} |
|
Navigator.of(context).pop(); |
|
} |
|
}, |
|
child: const Text('Save'), |
|
), |
|
], |
|
), |
|
const SizedBox(height: spaceLarge), |
|
], |
|
); |
|
} |
|
}
|
|
|