【问题标题】:Error: The method 'data' isn't defined for the class 'Object?'. - 'Object' is from 'dart:core'错误:没有为类“对象?”定义方法“数据”。 - “对象”来自“飞镖:核心”
【发布时间】:2021-07-10 16:50:48
【问题描述】:

错误:

警告:null-aware 操作的操作数 '??'具有不包括空值的“字符串”类型。 "$${document["price"]}" ?? “价钱”, ^ lib/screens/product_page.dart:38:65:错误:方法“数据”没有为类“对象?”定义。

  • “对象”来自“飞镖:核心”。 尝试将名称更正为现有方法的名称,或定义名为“数据”的方法。 Map documentData = snapshot.data.data(); ^^^^

FAILURE:构建失败并出现异常。

  • 在哪里: 脚本 'C:\src\flutter\packages\flutter_tools\gradle\flutter.gradle' 行:1035

  • 出了什么问题: 任务 ':app:compileFlutterBuildDebug' 执行失败。

Process 'command 'C:\src\flutter\bin\flutter.bat'' 以非零退出值 1 结束

  • 尝试: 使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获得更多日志输出。运行 --scan 以获得完整的见解。

  • 通过https://help.gradle.org获得更多帮助

在 36 秒内构建失败 异常:Gradle 任务 assembleDebug 失败,退出代码为 1

代码:

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:your_store/constants.dart';
import 'package:your_store/widgets/custom_action_bar.dart';
import 'package:your_store/widgets/image_swipe.dart';

class ProductPage extends StatefulWidget {
  final String? productId;
  ProductPage({this.productId});

  @override
  _ProductPageState createState() => _ProductPageState();
}

class _ProductPageState extends State<ProductPage> {
  final CollectionReference _productRef =
      FirebaseFirestore.instance.collection("Products");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Stack(
      children: [
        FutureBuilder(
          future: _productRef.doc(widget.productId).get(),
          builder: (context, snapshot) {
            if (snapshot.hasError) {
              return Scaffold(
                body: Center(
                  child: Text("Error: ${snapshot.error}"),
                ),
              );
            }

            if (snapshot.connectionState == ConnectionState.done) {
              //Firebase document data map
              Map<String, dynamic> documentData = snapshot.data.data();

              //List of images
              List imageList = documentData["images"];

              return ListView(
                padding: EdgeInsets.all(0),
                children: [
                  ImageSwipe(imageList: imageList,),
                  Padding(
                    padding: const EdgeInsets.only(
                      top: 24.0,
                      left: 24.0,
                      right: 24.0,
                      bottom: 4.0,
                    ),
                    child: Text(
                      "\$${documentData["name"]}",
                      style: Constants.boldHeading,
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(
                      vertical: 4.0,
                      horizontal: 24.0,
                    ),
                    child: Text(
                      "\$${documentData["price"]}",
                      style: TextStyle(
                        fontSize: 18.0,
                        color: Theme.of(context).accentColor,
                        fontWeight: FontWeight.w600,
                      ),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(
                      vertical: 8.0,
                      horizontal: 24.0,
                    ),
                    child: Text(
                      "\$${documentData["desc"]}",
                      style: TextStyle(fontSize: 16.0),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.symmetric(
                      vertical: 24.0,
                      horizontal: 24.0,
                    ),
                    child: Text(
                      "Selected Size",
                      style: Constants.regularDarkText,
                    ),
                  ),
                ],
              );
            }

            //Loading State
            return Scaffold(
              body: Center(
                child: CircularProgressIndicator(),
              ),
            );
          },
        ),
        CustomActionBar(
          hasBackArrow: true,
          hasTitle: false,
          hasBackground: false,
        ),
      ],
    ));
  }
}

【问题讨论】:

    标签: android flutter dart flutter-layout flutter-dependencies


    【解决方案1】:

    我认为你的第二个比较条件是不完整的,而不是第二个如果请使用 if-else,这个条件。

    else if(snapshot.connectionState == ConnectionState.done && snapshot.hasData){...}
    

    【讨论】:

    • 对我不起作用,但感谢您试一试。
    【解决方案2】:

    对于您的情况,Flutter 最新的 null 安全功能会警告您 documentData["desc"] 访问可能存在 null 值。

    如果documentData为您返回null,您可以检查并指定一个值:

    Padding(
      padding: const EdgeInsets.symmetric(
        vertical: 8.0,
        horizontal: 24.0,
      ),
      child: Text(
        documentData["desc"] ?? "", // Create Text with empty string if documentData["desc"] is null
        style: TextStyle(fontSize: 16.0),
      ),
    )
    

    您可能还需要对访问地图的其他地方执行此操作。

    【讨论】:

    • 实际上,android studio 在我的这一行显示错误: Map documentData = snapshot.data.data();在括号之前的最后一个数据中,它表示:不能无条件地调用“数据”方法,因为接收者不能为空。当我尝试使用提示更正时,它会添加一个 !空检查器 n 要求我创建一个 var 数据。
    • 从您的角度来看似乎是一个错字。 Firebase 确实没有名为data() 的方法。应该是Map&lt;String, dynamic&gt; documentData = snapshot.data.documents
    • 你能否检查一下这个错误:github.com/Bhaskar2510/Final-Sem 我已经尝试解决它们,但我自己无法解决它们。
    猜你喜欢
    • 2021-07-15
    • 2022-01-22
    • 1970-01-01
    • 2021-08-26
    • 2020-05-31
    • 1970-01-01
    • 2013-05-23
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多