【问题标题】:How to store multiple data and merge it in one reference in Firebase Realtime Database如何在 Firebase 实时数据库中存储多个数据并将其合并到一个引用中
【发布时间】: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


    【解决方案1】:

    要更新数据库中的现有节点,您需要知道该节点的完整路径。所以你需要:

    1. 将每个节点的key保存在你的getData函数中,添加到widget树中,方便以后使用。

    2. 当您要更新节点时,请在 onPressed 中查找相关键。

    3. 然后您可以使用以下内容更新特定节点:

       databaseRef.child(keyThatYouKept).update({
           'ScannedItem': preview.barcodeItems
               .map((barCodeItem) => barCodeItem.toJson())
               .toList().toString().split('%'),
      

    您需要修改此代码以从第 1 步和第 2 步中获取密钥。

    【讨论】:

    • 嗨弗兰克,感谢您的回复,请您协助如何获取密钥,即您的第 1 步和第 2 步。我还是 Flutter 的新手
    • 您已经拥有这里的密钥:values.forEach((key,values) {。我不清楚渲染的数据如何与您要更新的数据库相关联,这就是为什么我无法向您展示如何修改代码。
    • 嗨弗兰克,我希望能够将列表视图中的数据传递到 TakePictureScreen 页面,然后获取捕获的图像文件并检索数据并存储到 Firebase Realtime 数据库中的一个参考
    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2012-06-11
    • 1970-01-01
    • 2019-08-31
    • 2018-02-17
    相关资源
    最近更新 更多