[英]RangeError (index): Invalid value: Valid value range is empty: 0 | Flutter Firebase
Hy there.嘿那里。 So my problem is this when the page loads it shows the follwing error for 1-2 seconds but then the data shows perfectly.
所以我的问题是,当页面加载时它会显示以下错误 1-2 秒,但随后数据显示完美。 It shouldn't have happen because i have provided "initialData" to "FutureBuilder".
它不应该发生,因为我已经向“FutureBuilder”提供了“initialData”。 Can anybody tells me what i am missing.
谁能告诉我我错过了什么。
Note: I cannot use if(snapshot.connectionState == ConnectionState.waiting) return CircleProgressIndicator();
注意:我不能使用
if(snapshot.connectionState == ConnectionState.waiting) return CircleProgressIndicator();
because i am using PageView.builder and when i move to 2nd page it refresh again and come to 1st page automatically因为我正在使用 PageView.builder 并且当我移动到第二页时它再次刷新并自动进入第一页
═══════ Exception caught by widgets library ═══════════════════════════════════
The following RangeError was thrown building FutureBuilder<List<dynamic>>(dirty, state: _FutureBuilderState<List<dynamic>>#bad68):
RangeError (index): Invalid value: Valid value range is empty: 0
The relevant error-causing widget was
FutureBuilder<List<dynamic>>
When the exception was thrown, this was the stack
#0 List.[] (dart:core-patch/growable_array.dart:177:60)
#1 _TasksState.build.<anonymous closure>
#2 _FutureBuilderState.build
#3 StatefulElement.build
#4 ComponentElement.performRebuild
...
════════════════════════════════════════════════════════════════════════════════
Here is my code:这是我的代码:
body: FutureBuilder(
initialData: [],
future: Future.wait([
getRequests(),
getCNIC(),
]),
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
indexLength = snapshot.data[0].length;
cnicCheck = snapshot.data[1];
if (indexLength == 0)
return SizedBox(
child: Center(
child: Text(
"No Buyer Requests",
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 20,
color: kPrimaryColor),
),
),
);
return SizedBox(
child: PageView.builder(
itemCount: indexLength,
physics: PageScrollPhysics(),
controller: PageController(viewportFraction: 1.0),
onPageChanged: (int index) => setState(() => _index = index),
itemBuilder: (_, i) {
return SingleChildScrollView(
child: Card(
margin: EdgeInsets.all(10),
child: Wrap(
children: <Widget>[
ListTile(
leading: CircleAvatar(
backgroundColor: kPrimaryColor.withOpacity(0.8),
backgroundImage:
AssetImage('assets/images/nullUser.png'),
child: snapshot.data[0][i]['PhotoURL'] != null
? ClipRRect(
borderRadius: BorderRadius.circular(50),
child: Image.network(
snapshot.data[0][i]['PhotoURL'],
width: 50,
height: 50,
fit: BoxFit.cover,
),
)
: ClipRRect(
borderRadius: BorderRadius.circular(50),
child: Image.asset(
'assets/images/nullUser.png',
width: 50,
height: 50,
fit: BoxFit.cover,
),
)),
title: Text(
snapshot.data[0][i]['Email'],
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w700,
color: Colors.black.withOpacity(0.7),
),
),
subtitle: Text(
snapshot.data[0][i]['Time'],
style: TextStyle(
color: Colors.black.withOpacity(0.6)),
),
),
Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.all(Radius.circular(5)),
color: Colors.grey[200],
),
padding: EdgeInsets.all(10),
child: Text(
snapshot.data[0][i]['Description'],
style: TextStyle(
color: Colors.black.withOpacity(0.6)),
),
),
SizedBox(
height: 8,
),
Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.all(Radius.circular(5)),
border:
Border.all(color: Colors.grey[300])),
child: ListTile(
leading: Icon(Icons.category_outlined),
title: Text(
'Category : ${snapshot.data[0][i]['Category']}',
style: TextStyle(
fontSize: 14,
color: Colors.grey,
),
),
),
),
SizedBox(height: 8),
Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.all(Radius.circular(5)),
border:
Border.all(color: Colors.grey[300])),
child: ListTile(
leading: Icon(Icons.location_pin),
title: Text(
snapshot.data[0][i]['Location'],
style: TextStyle(
fontSize: 14,
color: Colors.grey,
),
),
),
),
SizedBox(height: 8),
Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.all(Radius.circular(5)),
border:
Border.all(color: Colors.grey[300])),
child: ListTile(
leading: Icon(
Icons.attach_money,
color: kGreenColor,
),
title: Text(
'Budget : Rs.${snapshot.data[0][i]['Budget']}',
style: TextStyle(
fontSize: 14,
color: kGreenColor,
),
),
),
),
SizedBox(height: 8),
Container(
decoration: BoxDecoration(
borderRadius:
BorderRadius.all(Radius.circular(5)),
border:
Border.all(color: Colors.grey[300])),
child: ListTile(
leading: Icon(Icons.timer),
title: Text(
'Duration : ${snapshot.data[0][i]['Duration']}',
style: TextStyle(
fontSize: 14,
color: Colors.grey,
),
),
),
),
SizedBox(
height: 35,
),
RaisedButton(
padding:
EdgeInsets.symmetric(vertical: 10),
child: Text('Send Offer'),
textColor: Colors.white,
color: Colors.green,
onPressed: () {
if (cnicCheck == "verified") {
print(cnicCheck);
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => SendOffer(snapshot.data[0][i].id),
),
);
} else {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => VerifyCNIC(),
),
);
}
},
),
SizedBox(
height: 15,
),
Center(
child: Text(
"${i + 1}/$indexLength",
style: TextStyle(fontSize: 13),
),
),
],
),
),
],
),
),
);
},
),
);
},
),
Your problem: You try to access a value at an index of the list that does not exist.您的问题:您尝试访问不存在的列表索引处的值。 This is because, the provided initial data is an empty list.
这是因为,提供的初始数据是一个空列表。 When the ´FutureBuilder´ first gets called all the code that it contains is executed using the initial data.
当“FutureBuilder”第一次被调用时,它包含的所有代码都使用初始数据执行。 And so the first two lines would throw an error message because you try to get the first and the second element from the list when it is in fact empty and does not have a first or second element.
所以前两行会抛出一个错误消息,因为你试图从列表中获取第一个和第二个元素,而实际上它是空的并且没有第一个或第二个元素。
The solution: You have to decide for yourself handle how you show your user that the data is still loading.解决方案:您必须自己决定如何向用户显示数据仍在加载。 But if there is the possibility that your list may be empty or may only contain one element you definitely have to check if this is the case before you try accessing these items from the list.
但是,如果您的列表可能为空或可能仅包含一个元素,则在尝试从列表中访问这些项目之前,您必须检查是否是这种情况。
So just use:所以只需使用:
if (snapshot.data.length > 1)
before you execute:在执行之前:
indexLength = snapshot.data[0].length;
cnicCheck = snapshot.data[1];
I really hope I could help:)我真的希望我能帮上忙:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.