#flutter #dart
Вопрос:
Я не понимаю, как сохранить сгенерированный QR — код в Firebase. На данный момент мне удалось сохранить в базе данных только текстовые поля, которые создают QR-код.
Я генерирую QR-код таким образом по умолчанию, а затем, когда все поля вставлены, он меняется. Может быть, мне следует преобразовать его в файл image.png, но как я могу получить изображение из QrImage.
Center( child: QrImage( data: qrData qrData2 qrData3 qrData4, version: QrVersions.auto, size: 165.0, backgroundColor: Colors.white, errorStateBuilder: (cxt, err) { return Container( child: Center( child: Text( "Something gone wrong ...", textAlign: TextAlign.center, ), ), ); }, ), ),
import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:garden_service/sidebar/menu.dart'; import 'package:garden_service/tools/costants.dart'; import 'package:qr_flutter/qr_flutter.dart'; import 'dart:ui'; import 'package:rflutter_alert/rflutter_alert.dart'; import 'package:flutter/rendering.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; class GeneraQR extends StatefulWidget { @override _HomeScreenState createState() =gt; _HomeScreenState(); } class _HomeScreenState extends Statelt;GeneraQRgt; { final GlobalKeylt;ScaffoldStategt; _scaffoldKey = new GlobalKeylt;ScaffoldStategt;(); CollectionReference articolo = FirebaseFirestore.instance.collection('Articolo'); String qrData = ""; String qrData2 = ""; String qrData3 = ""; String qrData4 = ""; @override Widget build(BuildContext context) { return Scaffold( [...AppBar Code ...] backgroundColor: grey, body: Center( child: ListView( padding: EdgeInsets.all(15.0), children: lt;Widgetgt;[ Column( children: lt;Widgetgt;[ Center( child: QrImage( data: qrData qrData2 qrData3 qrData4, version: QrVersions.auto, size: 165.0, backgroundColor: Colors.white, errorStateBuilder: (cxt, err) { return Container( child: Center( child: Text( "Something gone wrong ...", textAlign: TextAlign.center, ), ), ); }, ), ), ] ), Container( child: Center( child: Container( padding: EdgeInsets.all(10.0), child: Column( children: lt;Widgetgt;[ Padding( padding: const EdgeInsets.all(8.0), child: TextFormField( cursorColor: darkgrey, controller: qrdataFeed, maxLength: 50, decoration: InputDecoration( labelText: 'Product name', labelStyle: TextStyle( color: green), focusedBorder: OutlineInputBorder(borderSide: BorderSide(color: green, width: 1.2)), enabledBorder: OutlineInputBorder(borderSide: BorderSide(color: darkgrey, width: 0.0)), ), ), ), SizedBox( height: 15.0, ), [... 3x TextFormFiels are similar to above ] Material( elevation: 5.0, borderRadius: BorderRadius.circular(30.0), child: MaterialButton( onPressed: () async { if(qrdataFeed.text.isEmpty||qrdataFeed2.text.isEmpty||qrdataFeed3.text.isEmpty||qrdataFeed4.text.isEmpty){ _onAlertButtonPressedError(context); }else{ _onAlertButtonPressedConfirm(context); setState(() { qrData = qrdataFeed.text; qrData2 = qrdataFeed2.text; qrData3 = qrdataFeed3.text; qrData4 = qrdataFeed4.text; }); await articolo.add({ 'nome': qrdataFeed.text, 'descrizione': qrdataFeed2.text, 'pezzi': qrdataFeed3.text, 'prezzo': qrdataFeed4.text, }); } }, minWidth: 150.0, height: 50.0, color: green, shape: new RoundedRectangleBorder(borderRadius: new BorderRadius.circular(30.0),), child: Text( "Generate QR code", style: TextStyle( fontSize: 16.0,color: Colors.white, fontWeight: FontWeight.bold), ), ), ) ], ), ), ), ), ] ), ), ); } final qrdataFeed = TextEditingController(); final qrdataFeed2 = TextEditingController(); final qrdataFeed3 = TextEditingController(); final qrdataFeed4 = TextEditingController(); } _onAlertButtonPressedError(context) { Alert( context: context, type: AlertType.error, title: "ERROR", desc: "All fields are required!", buttons: [], ).show(); } _onAlertButtonPressedConfirm(context) { Alert( context: context, type: AlertType.success, title: "SUCCESS", desc: "QR code created !", buttons: [], ).show(); }
Комментарии:
1. Qr-код-это просто строка. Почему вы хотите преобразовать его в png и т. Д.. Сохраните данные Qr — кода нет?
2. QR — данные сохранены правильно, и я уже реализовал их, но мне нужно сохранить QR-код, потому что тогда я должен распечатать его, и когда я пойду сканировать его, он должен будет предоставить мне все поля, зарегистрированные в отсканированном QR-коде. Поэтому, я думаю, мне нужно где-то сохранить QR-изображение.
Ответ №1:
Исправлено путем добавления следующих строк кода.
import 'package:share/share.dart'; import 'dart:ui' as ui; import 'dart:typed_data'; import 'dart:io'; import 'package:path_provider/path_provider.dart';
Завернутый QRImage внутри перекрасьте границы и добавьте значение ключа.
RepaintBoundary( key: globalKey, child: QrImage( data: qrData qrData2 qrData3 qrData4, version: QrVersions.auto, size: 165.0, backgroundColor: Colors.white, errorStateBuilder: (cxt, err) { return Container( child: Center( child: Text( "Something gone wrong ...", textAlign: TextAlign.center, ), ), ); }, ), ),
Затем добавлена функция захвата
Futurelt;voidgt; _captureAndSharePng() async { RenderRepaintBoundary? boundary = globalKey.currentContext!.findRenderObject() as RenderRepaintBoundary?; ui.Image image = await boundary!.toImage(); ByteData? byteData = await image.toByteData(format: ui.ImageByteFormat.png); Uint8List pngBytes = byteData!.buffer.asUint8List(); final tempDir = await getExternalStorageDirectory(); final file = await new File('${tempDir!.path}/shareqr.png').create(); await file.writeAsBytes(pngBytes); await Share.shareFiles([file.path]);}
Вызовите _captureAndSharePng (), где вы хотите.
Сделано!