firebase FlutterFlow中的自定义函数:无法返回firestore文档的int值

zpgglvta  于 2023-11-21  发布在  Flutter
关注(0)|答案(3)|浏览(151)

我试图在我的firestore文档集合中对一个整数字段求和,尽管我一直得到错误。看起来是因为firestore将整数存储为“num”。
无法从函数“calculateTotalItemQty”返回“Future”类型的值,因为它的返回类型为“int”。

import 'dart:convert';
import 'dart:math' as math;

import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:intl/intl.dart';
import 'package:timeago/timeago.dart' as timeago;
import '/flutter_flow/lat_lng.dart';
import '/flutter_flow/place.dart';
import '/flutter_flow/uploaded_file.dart';
import '/flutter_flow/custom_functions.dart';
import '/backend/backend.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import '/backend/schema/structs/index.dart';
import '/auth/firebase_auth/auth_util.dart';

int calculateTotalItemQty(
  String? itemId,
  String? businessId,
) {
  /// MODIFY CODE ONLY BELOW THIS LINE

  // sum value of all itemQty in purchaseLine where itemId is itemId and businessId is businessId
  return FirebaseFirestore.instance
      .collection('purchases')
      .where('itemId', isEqualTo: itemId)
      .where('businessId', isEqualTo: businessId)
      .get()
      .then((querySnapshot) {
    int totalQty = 0;
    querySnapshot.docs.forEach((doc) {
      int value = doc['itemQty'];
      totalQty += value.toInt();
    });
    return totalQty;
  }).catchError((error) {
    print('Error getting total item qty: $error');
    return null;
  });

  /// MODIFY CODE ONLY ABOVE THIS LINE
}

字符串
尝试使用.toInt()但仍然无法工作

3wabscal

3wabscal1#

正如其他人提到的,你可以让你的函数async并返回一个Future。
然而,在FlutterFlow的自定义代码部分,“自定义操作”可以返回Future而不是“自定义函数”。因此,您可以将代码移动到自定义操作片段下,它应该可以工作。
您可以在Action Flow Editor中调用该自定义操作,在那里您可以获取返回的int值,然后对它执行任何您想要的操作。

4c8rllxm

4c8rllxm2#

你需要在Firebase方法前面添加await关键字。像下面的代码一样

Future<int?> calculateTotalItemQty(
  String? itemId,
  String? businessId,
) async {   
  return await FirebaseFirestore.instance
      .collection('purchases')
      .where('itemId', isEqualTo: itemId)
      .where('businessId', isEqualTo: businessId)
      .get()
      .then((querySnapshot) {
    int totalQty = 0;
    querySnapshot.docs.forEach((doc) {
      int value = doc['itemQty'];
      totalQty += value.toInt();
    });
    return totalQty;
  }).catchError((error) {
    print('Error getting total item qty: $error');
    return null;
  });
}

字符串

rqenqsqc

rqenqsqc3#

问题是你的函数试图返回一个Future<int>而不仅仅是一个int。要解决这个问题,让你的函数async并使用await关键字进行Firestore查询。

Future<int> calculateTotalItemQty(
  String? itemId,
  String? businessId,
) async {
  try {
   /// MODIFY CODE ONLY BELOW THIS LINE

  // sum value of all itemQty in purchaseLine where itemId is itemId and businessId is businessId
    QuerySnapshot querySnapshot = await FirebaseFirestore.instance
        .collection('purchases')
        .where('itemId', isEqualTo: itemId)
        .where('businessId', isEqualTo: businessId)
        .get();

    int totalQty = 0;
    querySnapshot.docs.forEach((doc) {
      int value = doc['itemQty'] as int;
      totalQty += value;
    });

    return totalQty;
  } catch (error) {
    print('Error getting total item qty: $error');
    return 0;
  }
  
  
  /// MODIFY CODE ONLY ABOVE THIS LINE
}

字符串
我希望这能帮上忙。

相关问题