微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter StaggeredGridView.countBuilder 滚动控件我遇到了这个错误“String”类型不是“index”的“int”类型的子类型

如何解决Flutter StaggeredGridView.countBuilder 滚动控件我遇到了这个错误“String”类型不是“index”的“int”类型的子类型

我在使用滚动控制器控制网格视图时遇到问题。我遇到了错误(“String”类型不是“index”的“int”类型的子类型)。但是在使用滚动控制器之前它是完美的。我不需要更改以消除此错误。我还在 stackoverflow 中检查了与此相关的其他问题,但无法解决。任何人都可以检查并告诉我可以在此处进行哪些更改以消除错误显示数据,以及我的条件是否适合在每个滚动端加载 10 个数据。

import 'dart:convert';
import 'package:Flutter_staggered_grid_view/Flutter_staggered_grid_view.dart';
import 'package:gridview_screoll/grid_content.dart';
import 'package:http/http.dart' as http;
import 'package:Flutter/material.dart';
import 'constant.dart';

class ScrollableGrid extends StatefulWidget {
  @override
  _ScrollableGridState createState() => _ScrollableGridState();
}

class _ScrollableGridState extends State<ScrollableGrid> {

  List data = [];
  bool isLoading = false;

  ScrollController _scrollController;
  int pageCount = 1;

  @override
  void initState() {
    // Todo: implement initState
    super.initState();
    this.fetchTopProducts();
    addItemIntoLisT(pageCount);
    _scrollController = new ScrollController(initialScrollOffset: 5.0)
      ..addListener(_scrollListener);
  }

  _scrollListener() {
    if (_scrollController.offset >=
        _scrollController.position.maxScrollExtent &&
        !_scrollController.position.outOfRange) {
      setState(() {
        isLoading = true;

        if (isLoading) {
          pageCount = pageCount + 1;

          addItemIntoLisT(pageCount);
        }
      });
    }
  }

  void addItemIntoLisT(var pageCount) {
    for (int i = (pageCount * 10) - 10; i < pageCount * 10; i++) {
      fetchTopProducts();
      isLoading = false;
    }
  }

  @override
  void dispose() {
    _scrollController.dispose();
    super.dispose();
  }

  fetchTopProducts() async {
    setState(() {
      isLoading = true;
    });
    var url = base_api + "api_frontend/top_products";
    var response = await http.get(url);
    print(response.body);
    if (response.statusCode == 200) {
      setState(() {
        data.add(json.decode(response.body)['top_products']);
        isLoading = false;
      });
    } else {
      setState(() {
        data = [];
        isLoading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 0.1,backgroundColor: Colors.indigo,title: Text('GridControll'),//backgroundColor: Color.fromrGBO(244,246,249,1),),body: SingleChildScrollView(
        child: Column(
          children: [
            Container(
              height: MediaQuery.of(context).size.height * 88/100,color: Color.fromrGBO(244,margin: const EdgeInsets.only(
                  left: 0.0,bottom: 2.0,right: 0.0,top: 0),child: getBody2(),],);
  }

  Widget getBody2() {
    if (isLoading || data.length == 0) {
      return Center(
          child: CircularProgressIndicator(
              valueColor: new AlwaysstoppedAnimation<Color>(primary)));
    }
    return StaggeredGridView.countBuilder(
      padding: const EdgeInsets.all(10.0),controller: _scrollController,shrinkWrap: true,// physics: NeverScrollableScrollPhysics(),crossAxisCount: 2,itemCount: data.length - 1,itemBuilder: (context,index) {
        return GestureDetector(
            onTap: () {
              Navigator.push(
                context,MaterialPageRoute(
                  //builder: (context) => ProductDetails(item: data2[index]),builder: (context) => productDetail(data[index]),);
            },child: cardItem2(data[index]));
      },staggeredTileBuilder: (int index) => StaggeredTile.fit(1),mainAxisspacing: 10.0,crossAxisspacing: 10.0,);
  }
}

这是 grid_content.dart:

import 'package:html_unescape/html_unescape.dart';
import 'package:Flutter/material.dart';

Widget cardItem2(item) {
  // var img = item['thumbnail'];
  // var thumbnail = base_api+"uploads/product_thumbnails/"+img;
  var productId = item['product_id'];
  var thumbnail = item['thumbnail'];
  var unescape = new HtmlUnescape();
  var name = unescape.convert(item['name']);
  var unit = item['unit'];
  var discount = item['discount'];
  var price = item['price'];
  var discountPrice = item['discount_price'];
  return discount != '0%' ? Card(
    elevation: 6,shadowColor: Colors.white,shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(9.0)),child: Stack(
      fit: StackFit.loose,alignment: Alignment.center,children: [
        Column(
          children: <Widget>[
            Stack(
              children: [
                ClipRRect(
                  borderRadius: BorderRadius.only(topRight: Radius.circular(9),topLeft: Radius.circular(9)),child: FadeInImage.assetNetwork(
                    placeholder: 'assets/loading_animated.gif',image: thumbnail,height: 110,width: double.infinity,fit: BoxFit.cover,Padding(
              padding: const EdgeInsets.only(left:6.0,right: 6.0),child: Row(
                children: [
                  Expanded(
                    child: Padding(
                      padding: const EdgeInsets.all(4.0),child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,children: [
                          Text(
                            name,style: TextStyle(
                              fontSize: 16.0,color: Colors.black87,fontWeight: FontWeight.w100,Text(
                            unit,style: TextStyle(
                              fontSize: 12.0,color: Colors.black45,Row(
                            children: [
                              Expanded(
                                flex: 2,child: Text(
                                  discountPrice,style: TextStyle(
                                    fontSize: 16.0,color: Colors.green,fontWeight: FontWeight.w500,Expanded(
                                flex: 2,child: Text(
                                  price,style: TextStyle(
                                    fontSize: 12.0,color: Colors.black38,decoration: Textdecoration.lineThrough,ButtonTheme(
                                padding: EdgeInsets.symmetric(vertical: 4.0,horizontal: 6.0),//adds padding inside the button
                                materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,//limits the touch area to the button area
                                minWidth: 0,//wraps child's width
                                height: 25,child: FlatButton(
                                  minWidth: 5,height: 40,color: Color.fromrGBO(100,186,2,onpressed: () {
                                  },child: Icon(Icons.shopping_cart,color: Colors.white,shape: RoundedRectangleBorder(
                                      borderRadius: BorderRadius.circular(10.0),side: BorderSide(color: Color.fromrGBO(100,)),) : Card(
    elevation: 6,Row(
                            children: [
                              Expanded(
                                flex: 1,style: TextStyle(
                                    fontSize: 15.0,materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,minWidth: 0,child: FlatButton(
                                  minWidth: 10,//height: 40,);
}

productDetail(item) {
  // var img = item['thumbnail'];
  // var thumbnail = base_api+"uploads/product_thumbnails/"+img;
  var productId = item['product_id'];
  var thumbnail = item['thumbnail'];
  var unescape = new HtmlUnescape();
  var name = unescape.convert(item['name']);
  var discount = item['discount'];
  var price = item['price'];
  var disPrice= item['discount_price'];
  var unit = item['unit'];

  return Scaffold(
    appBar: AppBar(
      elevation: 0.1,iconTheme: IconThemeData(color: Colors.white),backgroundColor: Colors.red,title: Center(
        child: Padding(
          padding: const EdgeInsets.only(right: 50),child: Text(
            'Product Details',style: TextStyle(color: Colors.white),actions: <Widget>[
        Padding(
          padding: const EdgeInsets.only(top: 15,right: 25.0),child: GestureDetector(
            child: Stack(
              alignment: Alignment.topCenter,children: <Widget>[
                Icon(
                  Icons.favorite,onTap: () {},)
      ],body: SingleChildScrollView(
      child: Container(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.start,crossAxisAlignment: CrossAxisAlignment.start,children: [
            Padding(
              padding: const EdgeInsets.all(8.0),child: Container(
                child: FadeInImage.assetNetwork(
                  placeholder: 'assets/black_circle.gif',height: 210,width: 360,Center(
              child: Card(
                color: Colors.white38,child: Padding(
                  padding: const EdgeInsets.only(left: 12.0,right: 12,top: 4,bottom: 4),child: Text(
                    unit,style: TextStyle(
                      fontSize: 11,Padding(
              padding: const EdgeInsets.only(top: 8.0),child: Center(
                child: discount != '0%' ? Row(
                  mainAxisAlignment: MainAxisAlignment.center,children: [
                    Text(
                      disPrice,style: TextStyle(
                          fontSize: 22,fontWeight: FontWeight.bold),Padding(
                      padding: const EdgeInsets.only(left: 8.0),child: Text(
                        price,style: TextStyle(
                          fontSize: 18,color: Colors.black54,): Text(
                  price,style: TextStyle(
                      fontSize: 22,Padding(
              padding: const EdgeInsets.only(top: 4.0),child: Center(
                child: Text(
                  name,style: TextStyle(
                    fontSize: 18,Padding(
              padding: const EdgeInsets.all(8.0),child: Divider(),Container(
              child: Center(
                child: Text(
                  'Quantity',style: TextStyle(color: Colors.black45,fontSize: 15),Container(
              child: Center(
                child: Text(
                  '1',style: TextStyle(
                      color: Colors.black,fontSize: 22,//child: Text(store.activeProduct.qty.toString()),Padding(
              padding: const EdgeInsets.only(
                  left: 100.0,right: 100.0,bottom: 10.0),child: FlatButton(
                  shape: RoundedRectangleBorder(
                    borderRadius: BorderRadius.all(Radius.circular(4)),side: BorderSide(color: Color.fromrGBO(41,193,126,1)),color: Color.fromrGBO(41,padding: EdgeInsets.only(top: 8,bottom: 8),child: Center(
                    child: Text(
                      'BUY Now',style: TextStyle(color: Colors.white,fontSize: 16),onpressed: () {
                  }),child: FlatButton(
                  padding: EdgeInsets.only(top: 8,child: Center(
                    child: Text(
                      'ADD TO CART',style: TextStyle(color: Color.fromrGBO(41,onpressed: () {

                  }),);
}

这里是json文件

{
"top_products": [
    {
        "product_id": "63","category_id": "59","name": "Ice Cream","price": "$9","discount_price": "$8.91","discount": "1%","unit": "3 kg","thumbnail": "http://192.168.0.105/uploads/product_thumbnails/72908baa78a2db38f678283a2e483903.jpg"
    },{
        "product_id": "65","category_id": "47","name": "Malta","price": "$5","discount_price": "$4.5","discount": "10%","unit": "1 kg","thumbnail": "http://192.168.0.105/uploads/product_thumbnails/a63dcb5e4f883eb946585d287d25c397.jpg"
    },{},...
],"message": "Top hundred products","status": 200,"validity": true
}
======== Exception caught by widgets library =======================================================
The following _TypeError was thrown building:
type 'String' is not a subtype of type 'int' of 'index'

When the exception was thrown,this was the stack: 
#0      cardItem2 (package:gridview_screoll/grid_content.dart:7:23)
#1      _ScrollableGridState.getBody2.<anonymous closure> (package:gridview_screoll/scroll_grid.dart:130:20)
#2      SliverChildBuilderDelegate.build (package:Flutter/src/widgets/sliver.dart:449:22)
#3      SliverVariableSizeBoxAdaptorElement._build.<anonymous closure> (package:Flutter_staggered_grid_view/src/widgets/sliver.dart:144:38)
#4      _HashMap.putIfAbsent (dart:collection-patch/collection_patch.dart:140:29)
...
====================================================================================================

解决方法

itemCount: data.length - 1,

改成这样:

itemCount: data.length;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?