【问题标题】:Flutter error involving operator not defined涉及未定义运算符的颤振错误
【发布时间】:2020-12-28 11:11:19
【问题描述】:

我是 Flutter 新手,正在学习本教程,但目前遇到此错误

error: The operator '[]' isn't defined for the type 'Map<String, dynamic> Function()'. (undefined_operator at [chat_app_tutorial] lib\views\search.dart:33)

请我已经有这个错误超过 2 天了。我在这里检查过,我一直在网上研究,但到目前为止我还没有看到任何有效的方法。这是我从中得到错误的代码行。 我不确定需要我的代码的哪一部分才能帮助我,所以我将把所有内容都放好。

import 'package:chat_app_tutorial/widgets/widget.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class SearchScreen extends StatefulWidget {
  @override
  _SearchScreenState createState() => _SearchScreenState();
}

class _SearchScreenState extends State<SearchScreen> {
  
  DatabaseMethods databaseMethods = new DatabaseMethods();
  TextEditingController searchTextEditingController = new TextEditingController();

  QuerySnapshot searchSnapshot;

  initiateSearch(){
    databaseMethods.getUserByUsername(searchTextEditingController.text).then((val){
      setState(() {
        searchSnapshot = val;
      });
    });
  }

  Widget searchList(){
    return searchSnapshot != null ? ListView.builder(
        itemCount: searchSnapshot.docs.length,
        shrinkWrap: true,
        itemBuilder: (context, index){
          return SearchTile(

            userName: searchSnapshot.docs[0].data["name"],
            userEmail: searchSnapshot.docs[0].data["email"],
          );
        }
    ) : Container();
  }

  @override
  void initState() {
    initiateSearch();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: appBarMain(context),
      body: SingleChildScrollView(
        child: Container(
          child: Column(
            children: [
              Container(
                color: Color(0x54ffffff),
                padding: EdgeInsets.symmetric(horizontal: 24, vertical: 16),
                child: Row(
                  children: [
                    Expanded(
                        child: TextField(
                          controller: searchTextEditingController,
                          style: TextStyle(
                            color: Colors.white
                          ),
                          decoration: InputDecoration(
                            hintText: "Search username",
                            hintStyle: TextStyle(
                              color: Colors.white54
                            ),
                            border: InputBorder.none
                          ),
                        ),
                    ),
                    GestureDetector(
                      onTap: (){
                        initiateSearch();
                      },
                      child: Container(
                          height: 40,
                          width: 40,
                          decoration: BoxDecoration(
                            gradient: LinearGradient(
                              colors: [
                                const Color(0x36ffffff),
                                const Color(0x0fffffff)
                              ]
                            ),
                            borderRadius: BorderRadius.circular(40)
                          ),
                          padding: EdgeInsets.all(12),
                          child: Image.asset("assets/images/search_white.png")
                      ),
                    )
                  ],
                ),
              ),
              searchList()
            ],
          ),
        ),
      ),
    );
  }
}

class SearchTile extends StatelessWidget {
  final String userName;
  final String userEmail;
  SearchTile({this.userName, this.userEmail});

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Row(
        children: [
          Column(
            children: [
              Text(userName, style: simpleTextStyle(),),
              Text(userEmail, style: simpleTextStyle(),)
            ],
          ),
          Spacer(),
          Container(
            decoration: BoxDecoration(
              color: Colors.blue,
              borderRadius: BorderRadius.circular(30)
            ),
            padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
            child: Text("Message"),
          )
        ],
      ),
    );
  }
}```

【问题讨论】:

  • 我看不到错误报告在哪一行。我不相信它在您发布的代码中。无论如何,你得到的错误意味着你试图在 返回 Mapfunction 上调用 [],而不是在 Map 本身.无论您在哪里遇到该错误,都需要先调用该函数。
  • 很抱歉我可能在复制或粘贴时出错了。我已经编辑过了。你能指导我如何去做你的建议吗?请再次检查代码。

标签: flutter dart


【解决方案1】:

错误是抱怨:

 return SearchTile(

  userName: searchSnapshot.docs[0].data["name"],
  userEmail: searchSnapshot.docs[0].data["email"],
);

searchSnapshot.docs[0].data 是一个返回Map函数。您需要先调用该函数。

您可能想要searchSnapshot.docs[0].data()['name']searchSnapshot.docs[0].data()['email']

最好避免多次调用data()

var data = searchSnapshot.docs[0].data();
return SearchTile(userName: data['name'], userEmail: data['email']);

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2021-09-15
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    相关资源
    最近更新 更多