没有为类型“Object”定义运算符“[]”。尝试定义运算符“[]”

时间:2021-02-07 10:08:14

标签: firebase flutter flutter-futurebuilder

我的代码在以下错误中给出,我在此行中从 firebase 访问用户名时遇到问题

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous"> <button data-song-id="{{$song->id}}" class="vote-to-collection sub-button btn btn-primary" value="apply">testing</button>

它给出了上面提到的错误

我知道访问地图数据的唯一方法是这个

snapshot.data['username']

5 个答案:

答案 0 :(得分:8)

在新的flutter更新中,我们不需要添加.data()

我遇到了这个错误,删除 .data() 后问题解决了。

FutureBuilder<Object>(
  future: FirebaseFirestore.instance
   .collection('users')
   .doc(userId)
   .get(),
  builder: (context, snapshot) {
    if (snapshot.connectionState == ConnectionState.waiting) {
      return Text("Loading...");
    }
    return Text(
      snapshot['username'],
      style: TextStyle(
        fontWeight: FontWeight.bold,
      ),
    );
  }
),

答案 1 :(得分:0)

改变这个:

  snapshot.data['username'],

进入这个:

  snapshot.data.data()['username'];

data() 是一种方法

答案 2 :(得分:0)

snapshot.dataFutureBuilder 返回的数据。所以从技术上讲,snapshot.dataDocumentSnapshot 的一种。要访问此文档的数据,您应该使用 snapshot.data.data() 或以下代码:

FutureBuilder<Object>(
  future: FirebaseFirestore.instance
   .collection('users')
   .doc(userId)
   .get(),
  builder: (context, snapshot) {
    if (snapshot.connectionState == ConnectionState.done) {
      DocumentSnapshot doc = snapshot.data;
      return Text(
        doc.data()['username'],
        style: TextStyle(
          fontWeight: FontWeight.bold,
        ),
      );
    }
    return Text("Loading...");
  }
),

答案 3 :(得分:0)

在较新版本的 Flutter 中,您必须将 FutureBuilder 的类型指定为 DocumentSnapshot。编辑您的代码,如下所示:

           FutureBuilder<DocumentSnapshot>(
              future: FirebaseFirestore.instance
                  .collection('users')
                  .doc(userId)
                  .get(),
              builder: (context, snapshot) {
                if (snapshot.connectionState == ConnectionState.waiting) 
                {
                  return const Text('Loading...');
                }
                return Text(
                  snapshot.data!['username'],
                  style: const TextStyle(fontWeight: FontWeight.bold),
                );
              }),

这应该对你有用。

答案 4 :(得分:0)

对于更新版本,您必须将FutureBuilder 的类型指定为 DocumentSnapshot。此外,data 更改为 requiredData。 编辑您的代码,如下所示:

declare @id bigint;
insert into OrderPlaced default values;
set @id = SCOPE_IDENTITY();
EXEC sys.sp_set_session_context  @key= N'@id',@value = @id 

GO

declare @id bigint = CAST(SESSION_CONTEXT(N'@id') AS BIGINT)
EXEC dbo.GetRecieptById @ID = @id;

现在您的代码将完美运行。