颤抖:类型'String'不是类型'List <dynamic>'的子类型

时间:2019-12-05 10:57:48

标签: firebase flutter google-cloud-firestore flutter-layout

我实际上有两个问题。

  1. 我正在尝试像这样将String类型的对象添加到Firestore中的现有数组:
  addWalletToUser(coinAddress) async {
    final FirebaseUser user = (await FirebaseAuth.instance.currentUser());
    try {
      await Firestore.instance.collection('users').document(user.uid)
          .updateData({
            "cryptoAddresses": FieldValue.arrayUnion(coinAddress)
          });
    } catch (e) {
      print('error caught: $e');
      return null;
    }
  }

这将导致以下错误:flutter: type 'String' is not a subtype of type 'List<dynamic>'

  1. 我的第二个问题是,为什么在addWalletToUser时执行此if语句中的代码应返回 null
if (addWalletToUser(_textController.text) != null)

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:2)

关于此错误:

  

flutter:“ String”类型不是“ List”类型的子类型

这意味着您正在尝试将字符串分配给列表(如list = string)。

arrayUnion的参数类型为List<dynamic>

  static FieldValue arrayUnion(List<dynamic> elements) =>
      FieldValue._(FieldValueType.arrayUnion, elements);

https://github.com/FirebaseExtended/flutterfire/blob/master/packages/cloud_firestore/cloud_firestore/lib/src/field_value.dart#L35

因此,您需要执行以下操作:

"cryptoAddresses": FieldValue.arrayUnion(['data1','data2','data3'])

在您的情况下,可能是:

"cryptoAddresses": FieldValue.arrayUnion([coinAddress])

答案 1 :(得分:0)

我通过创建第三个函数解决了第二个问题:

  Future storeValues(coinAddress) async {
    final walletToUser = await addWalletToUser(coinAddress);
    final wallet = await createWallet(coinAddress);
    return [walletToUser,wallet];
  }

,并使用.then()调用该函数,如下所示:

 storeValues(_textController.text).then((val) {
                      if (val[0] != null && val[1] != null) {
                      //do something here
}}