我又回到了与我已经发布的关于堆栈溢出的问题相关的问题Error: '_elements.contains(element)': is not true
这个问题一直困扰着我,但我无法重现同样的问题,现在我已经尝试再次重新制作,我已经为每个人发布了代码,以弄清楚我做错了什么'抛出这个断言错误并使应用程序崩溃。
我是编程新手,非常感谢任何帮助。我已经删除了代码,我知道一些错误。但是,唯一主要的问题是Failed assertion: line 3927 pos 14: '_dependents.isEmpty': is not true.
和Failed assertion: line 1766 pos 12: '_elements.contains(element)': is not true.
重现的步骤。
main.dart
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:untitled1/addnewbranch.dart';
void main() {
runApp(
new MaterialApp(
home: new Branches(),
),
);
}
class ProjectModel {
BranchSetUpModelData branchesModel;
ProjectModel(this.branchesModel);
}
class BranchSetUpModelData {
String branchName;
String hostelType;
String area;
String city;
BranchSetUpModelData(this.branchName, this.hostelType, this.area, this.city);
}
DatabaseReference _branchesRef;
List<ProjectModel> projectModel = new List();
Map data = {};
List<String> mapKeys = new List();
DataSnapshot dataSnapshot;
class Branches extends StatefulWidget {
//const BranchView({ Key key }) : super(key: key);
const Branches({Key key}) : super(key: key);
@override
_BranchesState createState() => new _BranchesState();
}
class _BranchesState extends State<Branches> {
String userUid = '';
String text;
int noOfBranches = 0;
int itemCount;
Future<Null> getUserUid() async {
try {
//FirebaseUser user = await FirebaseAuth.instance.currentUser();
//userUid = user.uid;
//print(userUid);
_branchesRef =
FirebaseDatabase.instance.reference().child('data').child('branches');
print('branchesref = $_branchesRef');
if (_branchesRef != null) {
try {
_branchesRef.once().then((DataSnapshot snapShot) {
dataSnapshot = snapShot;
print(snapShot is Map);
print(dataSnapshot.value);
data = dataSnapshot.value;
print(data is Map);
print(data);
data.forEach((key, value) {
mapKeys.add(key);
});
print('no of branches = $noOfBranches');
projectModel.clear();
mapKeys.forEach((value) {
_branchesRef.child(value).once().then((DataSnapshot b) {
data = b.value;
data.keys.forEach((k) {
BranchSetUpModelData x = new BranchSetUpModelData(
b.value['branchDetails']['branchName'],
b.value['branchDetails']['hostelType'],
b.value['branchDetails']['area'],
b.value['branchDetails']['city'],
);
print('details from for each loop');
ProjectModel projectModelData = new ProjectModel(x);
projectModel.add(projectModelData);
});
print('projectmodel length = ${projectModel.length}');
});
});
setState(() {
noOfBranches = mapKeys.length;
itemCount = noOfBranches;
});
print('no of branches = $noOfBranches');
data.keys.forEach((k) {
print('inside this foreach loop');
print(k);
});
});
} catch (Exception) {
showDialog(
context: context,
child: new AlertDialog(
content: new Text(Exception.message.toString())));
}
} else {
print('user does not exist');
}
} catch (Exception) {
print(Exception.toString());
showDialog(
context: context,
child: new AlertDialog(
content: new Text(Exception.toString()),
));
}
}
@override
void initState() {
super.initState();
mapKeys.clear();
FirebaseDatabase.instance.setPersistenceEnabled(true);
FirebaseDatabase.instance.setPersistenceCacheSizeBytes(10000000);
getUserUid();
/*setState((){
noOfBranches = mapKeys.length;
});*/
print('noOfBranches in init state= $noOfBranches');
}
@override
Widget build(BuildContext context) {
print('noof branches inside widget build = $noOfBranches');
//if(noOfBranches!=0) {
return new MaterialApp(
title: 'Branches',
theme: new ThemeData(
primaryColor: const Color(0xFF229E9C),
),
home: new Scaffold(
appBar: new AppBar(
title: const Text('Branches'),
backgroundColor: Colors.teal[300],
),
floatingActionButton: new FloatingActionButton(
heroTag: 'branchesHeroTag',
child: new Icon(Icons.add),
backgroundColor: Colors.teal[300],
onPressed: (() {
Navigator.push(
context,
new MaterialPageRoute(
builder: (_) => new AddNewBranch(),
),
);
}),
tooltip: 'Add Branch',
),
body: new Container(
child: new ListView.builder(
padding: const EdgeInsets.only(
left: 4.0,
right: 4.0,
),
itemCount: itemCount,
itemBuilder: (BuildContext context, int index) {
if (noOfBranches != 0) {
// children: <Widget>[
return new InkWell(
onTap: (() {
/*Navigate here to a different page*/
}),
child: new Card(
child: new Column(
children: <Widget>[
new Container(
//margin: const EdgeInsets.only(top:16.0),
padding: const EdgeInsets.only(top: 16.0),
child: new Row(
children: <Widget>[
new Expanded(
child: new Row(
children: <Widget>[
new Container(
margin: const EdgeInsets.only(
left: 16.0,
right: 8.0,
top: 4.0,
bottom: 4.0),
child: new IconButton(
icon: new Icon(Icons.call),
onPressed: (() {}))),
new Container(
child: new Text(
'80/125',
style: new TextStyle(
fontSize: 18.0,
),
),
),
],
),
),
new Expanded(
child: new Row(
textDirection: TextDirection.rtl,
children: [
new Container(
margin:
const EdgeInsets.only(right: 16.0),
child: new Text(
projectModel[index]
.branchesModel
.hostelType,
style: new TextStyle(
fontSize: 18.0,
),
),
),
],
),
),
],
),
),
new Container(
margin:
const EdgeInsets.fromLTRB(16.0, 8.0, 16.0, 4.0),
child: new Row(children: <Widget>[
new Text(
projectModel[index].branchesModel.branchName,
style: new TextStyle(
fontSize: 24.0,
),
),
]),
),
new Container(
margin: const EdgeInsets.only(
left: 16.0, right: 16.0, bottom: 8.0),
child: new Row(
children: <Widget>[
new Text(projectModel[index].branchesModel.city),
],
),
),
],
),
),
); // InkWell ends here so this has to go into ListView.builder
} else {
itemCount = 1;
return new Center(
child: new Column(
// mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text(
'Setup your Hostel',
style: new TextStyle(
fontSize: 24.0,
color: Colors.grey[400],
fontWeight: FontWeight.bold,
),
),
new Text(
'Please click below + icon to Setup your Hostel',
style: new TextStyle(
fontSize: 16.0,
color: Colors.grey[400],
),
),
],
),
);
}
},
), // ListView.builder ends here.
),
),
);
}
}
globals.dart
library my_app.globals;
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
final FirebaseAuth auth = FirebaseAuth.instance;
final DatabaseReference databaseReference = FirebaseDatabase.instance.reference();
addnewbranch.dart
import 'dart:async';
import 'package:meta/meta.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:untitled1/main.dart';
import './globals.dart' as gl;
class BranchSetupModel {
String branchName;
String hostelType;
String area;
String city;
BranchSetupModel(this.branchName, this.hostelType, this.area, this.city);
}
BranchSetupModel branchSetupModel =
new BranchSetupModel('', 'Hostel Type', '', '');
class AddNewBranch extends StatefulWidget {
const AddNewBranch({Key key}) : super(key: key);
@override
State<StatefulWidget> createState() {
return new _AddNewBranchState();
}
}
class _AddNewBranchState extends State<AddNewBranch> {
String actionsString = 'Next';
String userUid;
TextEditingController _branchNameController = new TextEditingController();
TextEditingController _areaController = new TextEditingController();
TextEditingController _cityController = new TextEditingController();
final GlobalKey<FormState> _formKey = new GlobalKey<FormState>();
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>();
bool _formWasEdited = false;
bool _autovalidate = false;
String dropDownvalue = 'Hostel Type';
//FocusNode _branchManagerNameFocusNode = new FocusNode();
String _validateName(String value) {
_formWasEdited = true;
if (value.isEmpty) return 'Name is required.';
final RegExp nameExp = new RegExp(r'^[A-Za-z ]+$');
if (!nameExp.hasMatch(value))
return 'Please enter only alphabetical characters and spaces.';
return null;
}
Future<Null> getUserUid() async {
try {
FirebaseUser user = await FirebaseAuth.instance.currentUser();
userUid = user.uid;
print(userUid);
} catch (Exception) {
print(Exception.toString());
}
}
@override
void initState() {
super.initState();
getUserUid();
_branchNameController =
new TextEditingController(text: branchSetupModel.branchName);
_areaController = new TextEditingController(text: branchSetupModel.area);
_cityController = new TextEditingController(text: branchSetupModel.city);
dropDownvalue = branchSetupModel.hostelType;
branchSetupModel = new BranchSetupModel('', 'Hostel Type', '', '');
}
@override
Widget build(BuildContext context) {
return new MaterialApp(
theme: new ThemeData(
primarySwatch: Colors.teal,
),
title: 'Branch Setup',
home: new Scaffold(
appBar: new AppBar(
title: const Text('Add New Branch'),
backgroundColor: Colors.teal[300],
leading: new IconButton(
icon: new Icon(Icons.arrow_back),
onPressed: (() {
print('back button clicked');
//to be removed and to include functionality here
Navigator.push(
context,
new MaterialPageRoute(
builder: (_) => new Branches(),
),
);
}),
),
actions: <Widget>[
new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
new FlatButton(
child: new Text(
actionsString,
style: new TextStyle(
fontSize: 20.0,
fontWeight: FontWeight.w500,
color: Colors.white,
),
),
onPressed: () {
print('Save button clicked');
String pushKey = gl.databaseReference
.child('data')
.child('branches')
.push()
.key;
gl.databaseReference
.child('data')
.child('branches')
.child(pushKey)
.child('branchDetails')
.set({
"branchName": branchSetupModel.branchName,
"hostelType": branchSetupModel.hostelType,
"area": branchSetupModel.area,
"city": branchSetupModel.city,
"pushKey": pushKey
});
Navigator.push(
context,
new MaterialPageRoute(
builder: (_) => new Branches(),
),
);
},
splashColor: const Color(0xFF229E9C),
),
],
),
),
],
),
body: new Form(
key: _formKey,
child: new ListView(
children: <Widget>[
new Container(
margin: const EdgeInsets.only(left: 16.0, right: 16.0),
child: new Row(
children: <Widget>[
new Text('Hostel Type'),
],
),
),
new Container(
//height: 56.0,
margin: const EdgeInsets.only(left: 16.0, right: 16.0),
child: new Column(
children: <Widget>[
new DropdownButton<String>(
//key: _dropDownKey,
hint: new Text(dropDownvalue),
items: <String>[
'Mens',
'Womens',
].map(
(String value) {
return new DropdownMenuItem<String>(
value: value,
child: new Text(value),
);
},
).toList(),
onChanged: (String value) {
setState(() {
dropDownvalue = value;
branchSetupModel.hostelType = value;
print(branchSetupModel.hostelType);
});
},
),
],
),
),
new Container(
margin: const EdgeInsets.only(left: 16.0, right: 16.0),
child: new Row(
children: <Widget>[
new Expanded(
child: new TextField(
autocorrect: false,
decoration: new InputDecoration(
labelText: 'Branch Name',
),
controller: _branchNameController,
onChanged: (String value) {
branchSetupModel.branchName =
_branchNameController.text;
print(branchSetupModel.branchName);
},
//validator: _validateName,
),
),
],
),
),
new Container(
margin: const EdgeInsets.only(left: 16.0, right: 16.0),
child: new Row(
children: <Widget>[
new Expanded(
child: new TextField(
decoration: new InputDecoration(
labelText: 'Area/Location',
),
controller: _areaController,
onChanged: (String value) {
branchSetupModel.area = value;
print(branchSetupModel.area);
},
//validator: _validateName,
),
),
],
),
),
new Container(
margin: const EdgeInsets.only(
left: 16.0,
right: 16.0,
),
child: new Row(
children: <Widget>[
new Expanded(
child: new TextField(
decoration: new InputDecoration(
labelText: 'City',
),
controller: _cityController,
onChanged: (String value) {
branchSetupModel.city = value;
},
),
),
],
),
),
],
),
),
),
);
}
}
pubspec.yaml
name: untitled1
description: A new Flutter project.
dependencies:
flutter:
sdk: flutter
google_sign_in: ^1.0.1
firebase_analytics: ^0.1.1
firebase_auth: ^0.3.1
firebase_database: ^0.1.2
firebase_storage: ^0.0.7
dev_dependencies:
flutter_test:
sdk: flutter
# For information on the generic Dart part of this file, see the
# following page: https://www.dartlang.org/tools/pub/pubspec
# The following section is specific to Flutter.
flutter:
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
请在尝试重现错误之前集成firebase应用程序以运行代码,并确保将读取和写入权限设置为“真实”&#39;因为我没有添加任何身份验证。
据我所知,错误只发生在main.dart文件中。它可以正常工作几次,然后错误开始进入。首先,它会抛出错误RangeError (index): Invalid value: Valid value range is empty: 0
此错误是ListView.builder()
然后出现另外两个断言错误。
请有人告诉我我做错了什么,或者有没有不同的方法来实现同样的目标而没有这些错误。
来自flutter doctor命令的输出。
[√] Flutter (on Microsoft Windows [Version 10.0.15063], locale en-GB, channel alpha)
• Flutter at C:\Users\Prayuta\flutter
• Framework revision e8aa40eddd (3 weeks ago), 2017-10-17 15:42:40 -0700
• Engine revision 7c4142808c
• Tools Dart version 1.25.0-dev.11.0
[√] Android toolchain - develop for Android devices (Android SDK 27.0.0)
• Android SDK at C:\Users\Prayuta\AppData\Local\Android\sdk
• Platform android-27, build-tools 27.0.0
• Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-915-b01)
[√] Android Studio (version 3.0)
• Android Studio at C:\Program Files\Android\Android Studio
• Java version OpenJDK Runtime Environment (build 1.8.0_152-release-915-b01)
[√] IntelliJ IDEA Community Edition (version 2017.2)
• Flutter plugin version 18.4
• Dart plugin version 172.4343.25
[√] Connected devices
• Android SDK built for x86 • emulator-5554 • android-x86 • Android 7.1.1 (API 25) (emulator)
Process finished with exit code 0.
答案 0 :(得分:2)
我的一位同事实际上改变了我构建ListView.builder的方式,现在我没有看到错误。我会密切关注这一点并发布任何新方法来回答这个问题,或者再次出现任何错误。
我只更改了我发布的main.dart文件以供参考。
main.dart
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:untitled1/addnewbranch.dart';
void main() {
runApp(
new MaterialApp(
home: new Branches(),
),
);
}
class ProjectModel {
BranchSetUpModelData branchesModel;
ProjectModel(this.branchesModel);
}
class BranchSetUpModelData {
String branchName;
String hostelType;
String area;
String city;
BranchSetUpModelData(this.branchName, this.hostelType, this.area, this.city);
}
DatabaseReference _branchesRef;
List<ProjectModel> projectModel = new List();
Map data = {};
List<String> mapKeys = new List();
DataSnapshot dataSnapshot;
class Branches extends StatefulWidget {
//const BranchView({ Key key }) : super(key: key);
const Branches({Key key}) : super(key: key);
@override
_BranchesState createState() => new _BranchesState();
}
class _BranchesState extends State<Branches> {
String userUid = '';
String text;
Future<Null> getUserUid() async {
try {
//FirebaseUser user = await FirebaseAuth.instance.currentUser();
//userUid = user.uid;
//print(userUid);
_branchesRef =
FirebaseDatabase.instance.reference().child('data').child('branches');
print('branchesref = $_branchesRef');
if (_branchesRef != null) {
try {
_branchesRef.once().then((DataSnapshot snapShot) {
dataSnapshot = snapShot;
print(snapShot is Map);
print(dataSnapshot.value);
data = dataSnapshot.value;
print(data is Map);
print(data);
data.forEach((key, value) {
mapKeys.add(key);
});
projectModel.clear();
mapKeys.forEach((value) {
_branchesRef.child(value).once().then((DataSnapshot b) {
data = b.value;
setState(() {
data.keys.forEach((k) {
BranchSetUpModelData x = new BranchSetUpModelData(
b.value['branchDetails']['branchName'],
b.value['branchDetails']['hostelType'],
b.value['branchDetails']['area'],
b.value['branchDetails']['city'],
);
print('details from for each loop');
ProjectModel projectModelData = new ProjectModel(x);
projectModel.add(projectModelData);
});
});
print('projectmodel length = ${projectModel.length}');
});
});
data.keys.forEach((k) {
print('inside this foreach loop');
print(k);
});
});
} catch (Exception) {
showDialog(
context: context,
child: new AlertDialog(
content: new Text(Exception.message.toString())));
}
} else {
print('user does not exist');
}
} catch (Exception) {
print(Exception.toString());
showDialog(
context: context,
child: new AlertDialog(
content: new Text(Exception.toString()),
));
}
}
@override
void initState() {
super.initState();
mapKeys.clear();
FirebaseDatabase.instance.setPersistenceEnabled(true);
FirebaseDatabase.instance.setPersistenceCacheSizeBytes(10000000);
getUserUid();
/*setState((){
noOfBranches = mapKeys.length;
});*/
}
@override
Widget build(BuildContext context) {
//if(noOfBranches!=0) {
return new MaterialApp(
title: 'Branches',
theme: new ThemeData(
primaryColor: const Color(0xFF229E9C),
),
home: new Scaffold(
appBar: new AppBar(
title: const Text('Branches'),
backgroundColor: Colors.teal[300],
),
floatingActionButton: new FloatingActionButton(
heroTag: 'branchesHeroTag',
child: new Icon(Icons.add),
backgroundColor: Colors.teal[300],
onPressed: (() {
Navigator.push(
context,
new MaterialPageRoute(
builder: (_) => new AddNewBranch(),
),
);
}),
tooltip: 'Add Branch',
),
body: (projectModel.length == 0)
? new Center(
child: new Column(
// mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Text(
'Setup your Hostel',
style: new TextStyle(
fontSize: 24.0,
color: Colors.grey[400],
fontWeight: FontWeight.bold,
),
),
new Text(
'Please click below + icon to Setup your Hostel',
style: new TextStyle(
fontSize: 16.0,
color: Colors.grey[400],
),
),
],
),
)
: new Container(
child: new ListView.builder(
padding: const EdgeInsets.only(
left: 4.0,
right: 4.0,
),
itemCount: projectModel.length,
itemBuilder: (BuildContext context, int index) {
// children: <Widget>[
return new InkWell(
onTap: (() {
/*Navigate here to a different page*/
}),
child: new Card(
child: new Column(
children: <Widget>[
new Container(
//margin: const EdgeInsets.only(top:16.0),
padding: const EdgeInsets.only(top: 16.0),
child: new Row(
children: <Widget>[
new Expanded(
child: new Row(
children: <Widget>[
new Container(
margin: const EdgeInsets.only(
left: 16.0,
right: 8.0,
top: 4.0,
bottom: 4.0),
child: new IconButton(
icon: new Icon(Icons.call),
onPressed: (() {}))),
new Container(
child: new Text(
'80/125',
style: new TextStyle(
fontSize: 18.0,
),
),
),
],
),
),
new Expanded(
child: new Row(
textDirection: TextDirection.rtl,
children: [
new Container(
margin: const EdgeInsets.only(
right: 16.0),
child: new Text(
projectModel[index]
.branchesModel
.hostelType,
style: new TextStyle(
fontSize: 18.0,
),
),
),
],
),
),
],
),
),
new Container(
margin: const EdgeInsets.fromLTRB(
16.0, 8.0, 16.0, 4.0),
child: new Row(children: <Widget>[
new Text(
projectModel[index].branchesModel.branchName,
style: new TextStyle(
fontSize: 24.0,
),
),
]),
),
new Container(
margin: const EdgeInsets.only(
left: 16.0, right: 16.0, bottom: 8.0),
child: new Row(
children: <Widget>[
new Text(
projectModel[index].branchesModel.city),
],
),
),
],
),
),
); // InkWell ends here so this has to go into ListView.builder
},
), // ListView.builder ends here.
),
),
);
}
}
我希望这会帮助每个正在努力解决相同用例的人解决他们的问题, 非常感谢。 鳅。
答案 1 :(得分:2)
对于可能觉得有帮助的任何人,我最近也遇到了这个问题,这是由于在小部件列表中错误地设置了多个key
参数引起的。我正在根据ID设置密钥:
key: Key(item.id.toString())
但是,由于某些其他逻辑,item.id
有时可以为null,并且由于存在许多小部件,因此我最终使用键为Key("null")
的多个小部件。更新我的密钥以确保其唯一性解决了我的问题:
key: Key(items.indexOf(item).toString())
答案 2 :(得分:1)
这发生在我身上,因为我用 const resp = await mailchimp.lists.updateListMemberTags(
mailchimpListId,
md5('my@email.com'),
{ body: { tags: [{ name: 'Tag Name', status: 'active' }] } }
);
包裹了一个 ListView.builder
,而没有将 Expanded
周围的容器直接作为我的 Expanded
的 body
。< /p>
答案 3 :(得分:0)
最近,当我尝试从有状态小部件导航到另一条路线时,我遇到了同样的例外。原来我忘了在小部件super.initState();
的开头添加行initState()
一旦我将其更改为此,它就会很好地工作
@override
void initState() {
super.initState();
....
}
答案 4 :(得分:0)
在我的情况下,我使用的是modalBox。因此,我创建了另一个表单密钥,并将其与它一起使用。那就是我解决我的方式
答案 5 :(得分:0)
对我来说,我在 initState() 中声明了我的表单键。我刚刚作为一个全局变量移出,它可以工作。
这是我的 initSatate() 现在:
@override
void initState() {
super.initState();
}
答案 6 :(得分:-1)
就我而言,问题是我在两个不同的屏幕中使用的 form
,同时静态地声明它的 key
之前 小部件本身。移动状态中的 key
声明解决了这个问题。