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
相关产品推荐
相关产品推荐

