You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter编译报错Object?类无'data'方法、Gradle任务执行失败如何解决

问题解决方案

你遇到的两个编译错误都是Flutter空安全和泛型类型推断导致的,可按以下步骤修复:

1. 修复Object?未定义方法'data'报错

原因

你使用的FutureBuilder没有指定泛型类型,编译器无法识别snapshot.data是Firestore的DocumentSnapshot类型,默认推断为Object?类型,所以找不到data()方法。

修复方法

给FutureBuilder加上泛型约束,同时对返回值做空安全校验:
找到代码里的FutureBuilder声明,修改为:

FutureBuilder<DocumentSnapshot>(
  future: _productRef.doc(widget.productId).get(),
  builder: (context, snapshot) {

然后修改获取文档数据的代码:

// 原来的写法
Map<String, dynamic> documentData = snapshot.data.data();
// 修改为带空安全的写法
Map<String, dynamic> documentData = snapshot.data?.data() as Map<String, dynamic>? ?? {};

2. 修复空感知运算符无效警告

原因

你把??运算符用在了字符串插值的结果后面,比如"$${document["price"]}" ?? "Price",插值后的字符串永远是非空的,所以这个空判断完全无效,触发编译器警告。

修复方法

把空判断移到字段取值的位置,同时对所有从Firestore取的字段做空安全处理,避免字段缺失导致崩溃:

// 图片列表空处理
List imageList = documentData["images"] ?? [];
// 商品名称空处理
"${documentData["name"] ?? "未命名商品"}",
// 商品价格空处理
"\$${documentData["price"] ?? "价格待更新"}",
// 商品描述空处理
"${documentData["desc"] ?? "暂无商品描述"}",

完整修改后代码

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<DocumentSnapshot>(
          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() as Map<String, dynamic>? ?? {};

              //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,
        ),
      ],
    ));
  }
}

内容的提问来源于stack exchange,提问作者Bhaskar2510

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 20:36:04