大佬教程收集整理的这篇文章主要介绍了List.generate 在 null 上调用了 getter 'length'。接收者:空尝试调用:长度,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
两个文件都有相同的问题 **getter 'length' 被调用为 null。 接收器:空 尝试调用:长度 ** 文件名 product.dart
import 'dart:convert';
import 'package:Flutter/material.dart';
import 'package:http/http.dart' as http;
import './product_List.dart';
import '../../../API/API_conf.dart' as APIBase;
import '../../../size_config.dart';
import './section_title.dart';
class PopularProducts extends StatefulWidget {
@overrIDe
_PopularProductsstate createState() => _PopularProductsstate();
}
class _PopularProductsstate extends State<PopularProducts> {
var url = APIBase.baseURL + "menus.php";
var menus;
voID initState() {
super.initState();
fetchData();
}
fetchData() async {
var res = await http.get(url);
menus = JsonDecode(res.body)["menu"];
print(menus);
setState(() {});
}
@overrIDe
Widget build(BuildContext context) {
return column(
children: List.generate(menus.length,(indeX) {
return column(children: [
padding(
padding: EdgeInsets.symmetric(
horizontal: getProportionateScreenWIDth(20),vertical: getProportionateScreenHeight(0)),child: Sectiontitle(title: menus[index]["name"],press: () {}),),SizedBox(height: getProportionateScreenWIDth(20)),SingleChildScrollVIEw(
scrollDirection: Axis.horizontal,child: ProductList(menuID: menus[index]["ID"]),]);
}),);
}
}
请检查 product.dart 文件的 res.body 打印
[{ID: 1,name: Electronics },{ID: 2,name: New Cloths },{ID: 3,name: T-Shirt },{ID: 4,name: Pak },{ID: 5,name: Shoes } ]
下一个自定义小部件 product_List.dart 两个页面都有相同的问题
import 'dart:convert';
import 'package:Flutter/material.dart';
import 'package:shop_app/components/product_card.dart';
import '../../../API/API_conf.dart' as APIBase;
import 'package:http/http.dart' as http;
class ProductList extends StatefulWidget {
final String menuID;
const ProductList({Key key,@required this.menuID}) : super(key: key);
@overrIDe
_ProductListState createState() => _ProductListState();
}
class _ProductListState extends State<ProductList> {
var products;
voID initState() {
super.initState();
var url = APIBase.baseURL + "products.php?menu_id=" + Widget.menuID;
fetchdata(url);
}
fetchdata(url) async {
var res = await http.get(url);
products = JsonDecode(res.body);
print(products);
setState(() {});
}
@overrIDe
Widget build(BuildContext context) {
return Row(
children: List.generate(
products.length,(indeX) {
return ProductCard(product: products[index]);
},);
}
}
请检查 product_List.dart 文件的 res.body 打印
[{ID: 1,name: IPhone 12,price: 300000,image: 1.jpg },name: Nokia,price: 20000,image: 2.jpg },name: OPPO,price: 50000,image: 3.jpg },name: MI,price: 40000,image: 4.jpg },name: Samsung,price: 34000,image: 5.jpg } ]
文件名 product_card.dart
import 'package:Flutter/material.dart';
import 'package:Flutter_svg/Flutter_svg.dart';
import 'package:shop_app/screens/details/details_screen.dart';
import '../API/API_conf.dart' as APIBase;
import '../constants.dart';
import '../size_config.dart';
class ProductCard extends StatefulWidget {
const ProductCard(
{Key key,this.wIDth = 140,this.aspectRetio = 1.02,@required this.product})
: super(key: key);
final double wIDth,aspectRetio;
final product;
@overrIDe
_ProductCardState createState() => _ProductCardState();
static ProductCard fromJson(i) {}
}
class _ProductCardState extends State<ProductCard> {
@overrIDe
Widget build(BuildContext context) {
return padding(
padding: EdgeInsets.only(left: getProportionateScreenWIDth(20)),child: SizedBox(
wIDth: getProportionateScreenWIDth(Widget.wIDth),child: GestureDetector(
onTap: () => Navigator.pushnamed(
context,DetailsScreen.routename,arguments: ProductDetailsArguments(product: Widget.product),child: column(
crossAxisAlignment: CrossAxisAlignment.start,children: [
AspectRatio(
aspectRatio: 1.02,child: Container(
padding: EdgeInsets.all(getProportionateScreenWIDth(20)),decoration: Boxdecoration(
color: kSecondarycolor.withOpacity(0.1),borderRadius: borderRadius.circular(15),child: Hero(
tag: Widget.product["ID"].toString(),child: FadeInImage(
image: NetworkImage(
APIBase.productURL + Widget.product["file_name"]),placeholder: Assetimage('assets/images/1.jpg'),const SizedBox(height: 10),Text(
Widget.product["name"],style: TextStyle(color: colors.black),maxlines: 2,Row(
mainAxisAlignment: MainAxisAlignment.spacebetween,children: [
Text(
Widget.product["price"].toString(),style: TextStyle(
FontSize: getProportionateScreenWIDth(18),FontWeight: FontWeight.w600,color: kPriMarycolor,InkWell(
borderRadius: borderRadius.circular(50),onTap: () {},child: Container(
padding: EdgeInsets.all(getProportionateScreenWIDth(8)),height: getProportionateScreenWIDth(28),wIDth: getProportionateScreenWIDth(28),decoration: Boxdecoration(
color: Widget.product["ID"] == 1
? kPriMarycolor.withOpacity(0.15)
: kSecondarycolor.withOpacity(0.1),shape: BoxShape.circle,child: SvgPicture.asset(
"assets/icons/Heart Icon_2.svg",color: Widget.product["ID"] == 1
? color(0xFFFF4848)
: color(0xFfdbDEE4),],)
],);
}
}
应用程序正常运行并在控制台上显示错误 * getter 'length' 被调用为 null。 接收器:空 尝试调用:长度 *
您的 fetchData
异步未在 initState
完成之前完成。因此,当 @H_229_11@menus 方法运行时,build
仍然为空。
您可以改用 FutureBuilder
:
class PopularProducts extends StatelessWidget {
var url = ApiBase.baseURL + "menus.php";
Future<Map<String,dynamic>> fetchData() async {
var res = await http.get(url);
return jsonDecode(res.body)["menu"];
}
@override
Widget build(BuildContext context) {
return FutureBuilder<Object>(
future: fetchData(),builder: (context,snapshot) {
switch (snapshot.connectionStatE) {
case ConnectionState.waiTing: return Text('Loading....');
default:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
else
return Text('Result: ${snapshot.data}');
}
},);
}
}
,
问题是因为 Widget build
将首先被调用,并且您没有在第一页中初始化您的两个列表。
您应该按如下方式初始化您的列表:
var products = List<ProductsCard>();
以上是大佬教程为你收集整理的List.generate 在 null 上调用了 getter 'length'。接收者:空尝试调用:长度全部内容,希望文章能够帮你解决List.generate 在 null 上调用了 getter 'length'。接收者:空尝试调用:长度所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。