程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了List.generate 在 null 上调用了 getter 'length'。接收者:空尝试调用:长度大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决List.generate 在 null 上调用了 getter 'length'。接收者:空尝试调用:长度?

开发过程中遇到List.generate 在 null 上调用了 getter 'length'。接收者:空尝试调用:长度的问题如何解决?下面主要结合日常开发的经验,给出你关于List.generate 在 null 上调用了 getter 'length'。接收者:空尝试调用:长度的解决方法建议,希望对你解决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,请注明来意。