flutter RangeError(index):无效值:不在0..1范围内,包括:2

yhqotfr8  于 2023-05-23  发布在  Flutter
关注(0)|答案(1)|浏览(211)

我想做一个搜索到我的firestore项目,有3个领域的A,B,C。当我点击我的搜索,它会显示,它是有关我的字母表,如果我没有使用大写,它也给我相同的结果,在大写的情况下.
我的准则是

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:fmiantrader/SearchService.dart';
import 'SearchService.dart';

class Serchitemsbymod extends StatefulWidget {
  static String id='serchitemsbymod';
  @override
  _SerchitemsbymodState createState() => _SerchitemsbymodState();
}

class _SerchitemsbymodState extends State<Serchitemsbymod> {


  List<String> store=[];
  var q=[];
  var t=[];

  initiateserach(value){
    if(value.length==0){
      setState(() {
        q=[];
        t=[];
      }

      );
    }
    var cp=value.substring(0,1).toUpperCase()+value.substring(1);
    if(q.length==0 && value.length==1){
      SearchService().searchByName(value).then((QuerySnapshot docs){
        for(int i=0;i <= docs.documents.length;i++){
          q.add(docs.documents[i].data);

        }
      }
      );
    }
    else{
      t=[];
      q.forEach((element){
        if(element['A'].startsWith(cp)){
          setState(() {
            t.add(element);
          });
        }
      }
      );
    };}

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Mian Traders'),
      ),
      body: ListView(
        children: <Widget>[
          Padding(padding: EdgeInsets.all(10.0),
          child: TextField(
            onChanged: (val){
              initiateserach(val);
            },
            decoration: InputDecoration(
              prefix: IconButton(icon:Icon(Icons.arrow_back),
                onPressed: (){
                Navigator.of(context).pop();
                },),
              contentPadding:   EdgeInsets.only(left: 25.0),
              hintText: 'Serach Items',
              hintStyle: TextStyle(
                fontWeight: FontWeight.w500,
                fontSize: 25.0
              ),
              border: OutlineInputBorder(
                borderRadius: BorderRadius.circular(4.0)

              )

            ),
          ),),
          SizedBox(height: 10.0,),
          GridView.count(
            padding: EdgeInsets.only(left: 10.0,right: 10.0),
            crossAxisCount: 2,
            crossAxisSpacing: 4.0,
            mainAxisSpacing: 4.0,
            primary: false,
            shrinkWrap: true,
            children:t.map((element){
              return buildResult(element);

            }).toList()),

        ]));

  }
}

Widget buildResult(data) {

  return Card(
    shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(10.0)),
    elevation: 2.0,
    child: Container(
      child: Center(
        child: Text(data['items'],
        textAlign: TextAlign.center,
        style: TextStyle(
          color: Colors.black,
          fontSize: 20.0,
        ),),

      ),
    ),

  );
}

并且搜索的基础是由于另一个字段D(作为搜索的关键字)。我的SearchService()类代码是

import 'package:cloud_firestore/cloud_firestore.dart';

class SearchService{
  searchByName(String searchField){
    return Firestore.instance.collection('items')
        .where('d',
        isEqualTo: searchField.substring(0,1).toUpperCase())
        .getDocuments();
  }
}
q8l4jmvw

q8l4jmvw1#

此问题似乎是由尝试读取的无效范围引起的。当迭代对象列表时,值用完时会发生此错误。您需要确定RangeError发生的位置。
如果在GridView上抛出错误,则与屏幕上预期的Widget相比,可能没有更多的数据要显示。确保Widget的项目计数与显示的List匹配。如果您只需要填充Grid中的空白区域,则可以使用return Container();

相关问题