【发布时间】:2021-09-21 22:16:20
【问题描述】:
我想使用一个参考发布扫描数据和捕获的图像文件的结果,以将其存储在 firebase 实时数据库中。到目前为止,当我单击“保存”按钮时,我可以将扫描的数据以列表的形式存储到数据库中,因此我还想将其他数据合并到所有参考中。 “捕获图像”按钮会打开一个用于捕获图像的新页面。 “添加另一个项目”按钮只允许扫描另一种类型的条形码。在 BarcodesResultPreviewWidget 类下面检查我的代码。
class BarcodesResultPreviewWidget extends StatelessWidget {
BarcodeScanningResult preview;
FirebaseFirestore firestore = FirebaseFirestore.instance;
final firestoreInstance = FirebaseFirestore.instance;
final DatabaseReference databaseRef = FirebaseDatabase.instance.reference().child('ScannedResults');
//Retrieving the data on console
void getData(){
databaseRef.once().then((DataSnapshot snapshot){
Map<dynamic, dynamic> values = snapshot.value;
values.forEach((key,values) {
print(values["ScannedItem"]);
});
});
}
BarcodesResultPreviewWidget(this.preview);
@override
Widget build(BuildContext context) {
Widget previewView;
//Initialize FlutterFire
//Firebase.initializeApp();
var barcodeImageURI = preview.barcodeImageURI;
if (barcodeImageURI != null) {
if (shouldInitWithEncryption) {
previewView = EncryptedPageWidget(barcodeImageURI);
} else {
previewView = PageWidget(barcodeImageURI);
}
} else {
previewView = Container();
}
return Scaffold(
appBar: AppBar(
iconTheme: IconThemeData(),
leading: GestureDetector(
child: Icon(
Icons.arrow_back,
color: Colors.black,
),
onTap: () {
Navigator.of(context).pop();
},
),
backgroundColor: Colors.white,
title: const Text('Scanned barcodes',
style: TextStyle(inherit: true, color: Colors.black)),
),
body: Column(
children: <Widget>[
previewView,
//printing scanned results
Expanded(
child: ListView.builder(
itemCount: preview.barcodeItems.length,
itemBuilder: (context, position) {
return BarcodeItemWidget(preview.barcodeItems[position]);
},
),
),
Wrap(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: FlatButton(
color: Colors.grey,
child: Text('Add Another Item',),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => MainPageWidget()),
);
},
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: FlatButton(
color: Colors.grey,
child: Text('Capture an Image',),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => TakePictureScreen(title: '',)) ,
);
},
),
),
Padding(
padding: const EdgeInsets.all(8.0),
child: FlatButton(
color: Colors.grey,
child: Text('Save',),
onPressed: () {
// databaseRef.push().set({
// 'ScannedItem': Map.fromIterable(preview.barcodeItems,
// key: (item) => preview.barcodeItems.indexOf(item),
// value: (item) => item.toJson()),
// });
databaseRef.push().set({
'ScannedItem': preview.barcodeItems
.map((barCodeItem) => barCodeItem.toJson())
.toList().toString().split('%'),
});
},
),
),
],
),
],
));
}
}
捕获图像类
class TakePictureScreen extends StatefulWidget {
TakePictureScreen({Key? key, required this.title}) : super(key: key);
final String title;
@override
_TakePictureScreenState createState() => _TakePictureScreenState();
}
class _TakePictureScreenState extends State<TakePictureScreen> {
final photos = <File>[];
void openCamera() {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => CameraCamera(
onFile: (file) {
photos.add(file);
Navigator.pop(context);
setState(() {});
},
)));
}
@override
Widget build(BuildContext context) {
final size = MediaQuery.of(context).size;
return Scaffold(
backgroundColor: Colors.black,
appBar: AppBar(
title: Text(widget.title),
),
body: GridView.builder(
gridDelegate:
SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
itemCount: photos.length,
itemBuilder: (_, index) => Padding(
padding: const EdgeInsets.all(8.0),
child: Container(
width: size.width,
child: Image.file(
photos[index],
fit: BoxFit.cover,
),
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: openCamera,
child: Icon(Icons.camera_alt),
),
);
}
}
【问题讨论】:
标签: flutter firebase-realtime-database