我正在从事这个项目,有一个错误,我不明白如何解决,请让我简要解释一下我在该项目中的工作及其工作方式。因此,基本上,该项目具有底部导航栏。底部导航中有5个屏幕(kpi,客户,地图,日历,报价)。目前,我正面临一个与客户和地图屏幕相关的错误。在客户屏幕中,我正在使用 filteredUsers 列表来搜索客户,并在客户屏幕中显示结果。在 initState 处的 filteredUsers 处已从数据库中填充了客户,但是使用搜索技术,从 filteredUsers 中添加/删除了值,
用于过滤/搜索 filteredUsers
的代码
setState(() {
filteredUsers = users
.where((u) => (u.name
.toLowerCase()
.contains(string.toLowerCase()) ||
u.email
.toLowerCase()
.contains(string.toLowerCase())))
.toList();
});
现在,我将点击搜索到的项目,并转到下一个屏幕,即客户资料,然后我将转到下一个屏幕,即客户设置,在更新客户信息后,我将点击编辑每件事都会按照我的意愿更新。
下面的代码说明了当我单击“确定”时,在响应弹出窗口上会发生什么,它使用我在客户资料设置中输入的更新数据来更新 filteredUsers 。
FlatButton(
child: Text('Ok'),
onPressed: () {
setState(() {
filteredUsers[widget.customerIndex].name=name.text;
filteredUsers[widget.customerIndex].email=email.text;
filteredUsers[widget.customerIndex].status=dropdownValue;
filteredUsers[widget.customerIndex].description=description.text;
filteredUsers[widget.customerIndex].location_2=location_2.text;
filteredUsers[widget.customerIndex].location_3=location_3.text;
filteredUsers[widget.customerIndex].phone=phone.text;
filteredUsers[widget.customerIndex].customerPhone_2=customerPhone_2.text;
filteredUsers[widget.customerIndex].postalCode=postalCode.text;
filteredUsers[widget.customerIndex].province=province.text;
filteredUsers[widget.customerIndex].communities=communities.text;
filteredUsers[widget.customerIndex].exercise=exercise.text;
filteredUsers[widget.customerIndex].reference=reference.text;
filteredUsers[widget.customerIndex].socType=socType.text;
filteredUsers[widget.customerIndex].activeMain=activeMain.text;
filteredUsers[widget.customerIndex].facebook=facebook.text;
filteredUsers[widget.customerIndex].youtube=youtube.text;
filteredUsers[widget.customerIndex].instagram=instagram.text;
filteredUsers[widget.customerIndex].twitter=twitter.text;
filteredUsers[widget.customerIndex].website=website.text;
filteredUsers[widget.customerIndex].otherNetworks=otherNetworks.text;
filteredUsers[widget.customerIndex].pinterest=pinterest.text;
});
Navigator.of(context).pop();
},
),
问题:现在,我将转到地图屏幕,在这里我可以在Google地图上看到相同的客户作为标记,当我点击这些标记时,它将转到相同的客户资料屏幕。在这里我还可以编辑客户,现在问题来了,当我在编辑记录后单击“编辑”按钮时,它在调试窗口中给了我例外。 '_ InternalLinkedHashMap'类型不是'int'类型的子类型 我发现的问题是,当我从myCustomer屏幕转到客户资料屏幕时,我正在通过它传递 filteredUsers 索引,因此当我编辑此记录时,它将检查索引并更新它,但是在在地图屏幕的情况下,我在这里没有 filteredUsers 的索引,因此当我从该边记录进行更新时不会更新。
将数据从我的客户屏幕传递到客户个人资料,然后传递到客户设置
ListView.builder(
padding: EdgeInsets.all(10.0),
itemCount: filteredUsers.length,
itemBuilder: (BuildContext context, int index) {
return InkWell(
onTap: () {
print(index);
// show details here
print("${filteredUsers[index].id} tapped");
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CustomerDetails(
index,
filteredUsers[index].id,
filteredUsers[index].name,
filteredUsers[index].email,
filteredUsers[index].description,
filteredUsers[index].phone,
filteredUsers[index].website,
filteredUsers[index].status,
filteredUsers[index].postalCode,
filteredUsers[index].location_2,
filteredUsers[index].location_3,
filteredUsers[index].province,
filteredUsers[index].communities,
filteredUsers[index].customerPhone_2,
filteredUsers[index].exercise,
filteredUsers[index].reference,
filteredUsers[index].activeMain,
filteredUsers[index].socType,
filteredUsers[index].facebook,
filteredUsers[index].instagram,
filteredUsers[index].twitter,
filteredUsers[index].pinterest,
filteredUsers[index].youtube,
filteredUsers[index].otherNetworks,
meetings)),
);
},
child: Card(
child: Padding(
padding: EdgeInsets.all(10.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
filteredUsers[index].name,
style: TextStyle(
fontSize: 16.0,
color: Colors.black,
),
),
SizedBox(
height: 5.0,
),
Text(
filteredUsers[index].email.toLowerCase(),
style: TextStyle(
fontSize: 14.0,
color: Colors.grey,
),
),
],
),
),
),
);
},
),
将数据从地图屏幕传递到客户个人资料,然后传递到客户设置
var i = 0;
for (var item in custInfo) {
if (item['customer_latitude'] == "" &&
item['customer_longitude'] == "") {
continue;
} else {
markerId = MarkerId((markers.length + 1).toString());
LatLng markerPos = LatLng(double.parse(item['customer_latitude']),
double.parse(item['customer_longitude']));
final Marker marker = Marker(
infoWindow: InfoWindow(
title: item['customer_name'],
snippet: item['customer_desc'],
),
// onTap: () => _onMarkerTapped(markerId),
icon: BitmapDescriptor.defaultMarkerWithHue(
item['customer_status'] == 'red'
? BitmapDescriptor.hueRed
: item['customer_status'] == 'yellow'
? BitmapDescriptor.hueYellow
: BitmapDescriptor.hueGreen),
markerId: markerId,
consumeTapEvents: true,
position: markerPos,
onTap: () {
print(i);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => CustomerDetails(
i,
item['customer_id'],
item['customer_name'],
item['customer_email'],
item['customer_desc'],
item['customer_phone'],
item['customer_website'],
item['customer_status'],
item['postal_code'],
item['location_2'],
item['location_3'],
item['province'],
item['communities'],
item['customer_phone_2'],
item['exercise'],
item['reference'],
item['active_main'],
item['soc_type'],
item['facebook'],
item['instagram'],
item['twitter'],
item['pinterest'],
item['youtube'],
item['other_networks'],
meetings)),
);
});
_markers = null;
markers[markerId] = marker;
}
i++;
}