原因:
軟鍵盤彈出的時候 跳轉(zhuǎn)qr_code_scanner 插件掃描二維碼頁面會出現(xiàn)黑屏問題
解決辦法:
1.使用TextFormField時 跳轉(zhuǎn)按鈕不要寫在 suffixIcon或者prefixIcon里面 單獨提出來不要和TextFormField關聯(lián)
跳轉(zhuǎn)時隱藏軟鍵盤
FocusScope.of(context).unfocus();
Future.delayed(Duration(milliseconds: 100), () async {
Navigator.push(context, MaterialPageRoute(builder: (context) {
return QRViewPage();
})).then((value) {
print('scan_____${value}');
});
});
2.暴力解決:
界面打開時直接重啟照相機,會出現(xiàn)不流暢的情況
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:qr_code_scanner/qr_code_scanner.dart';
class QRViewPage extends StatefulWidget {
@override
_QRViewPageState createState() => _QRViewPageState();
}
class _QRViewPageState extends State<QRViewPage> {
Barcode result;
QRViewController controller;
final GlobalKey qrKey = GlobalKey(debugLabel: 'QR');
@override
Widget build(BuildContext context) {
var scanArea = (MediaQuery.of(context).size.width < 400 ||
MediaQuery.of(context).size.height < 400)
? 200.0
: 300.0;
print("掃描大小=$scanArea");
print("width=${MediaQuery.of(context).size.width}");
return Scaffold(
body: SafeArea( // add safe area here
child:QRView(
key: qrKey,
// You can choose between CameraFacing.front or CameraFacing.back. Defaults to CameraFacing.back
// cameraFacing: CameraFacing.front,
onQRViewCreated: _onQRViewCreated,
// Choose formats you want to scan. Defaults to all formats.
// formatsAllowed: [BarcodeFormat.qrcode],
overlay: QrScannerOverlayShape(
borderColor: Colors.red,
borderRadius: 10,
borderLength: 30,
borderWidth: 10,
cutOutSize: scanArea,
),
)));
}
void _onQRViewCreated(QRViewController controller) {
print("controller====");
this.controller = controller;
String qrData;
controller.scannedDataStream.listen((scanData) {
print("scanData====$scanData");
if (scanData != null) {
qrData = scanData.code;
controller.dispose();
}
}, onDone: () {
Navigator.of(context).pop(qrData);
});
refresh();
}
void refresh() {
Future.delayed(Duration(milliseconds: 100), () async {
print("刷新相機");
await controller.pauseCamera();
await controller.resumeCamera();
});
}
@override
void dispose() {
controller?.dispose();
super.dispose();
}
}