======== widgets 库捕获异常 ==================================== =================== 构建 MyHomePage 时引发了以下断言(脏,依赖项:[MediaQuery],状态:_MyHomePageState#a3bdf(代码:跟踪 1 代码)): 应该只有一个项目具有 [DropdownButton] 的值:Marker{markerId: MarkerId(First Marker), alpha: 1.0, anchor: Offset(0.5, 1.0), consumeTapEvents: false, draggable: false, flat: false,图标:“BitmapDescriptor”的实例,infoWindow:InfoWindow{title:第一个标记,片段:null,锚点:Offset(0.5,0.0)},位置:LatLng(37.42267,-122.0838),旋转:0.0,可见:true , zIndex: 0.0, onTap: null, onDragStart: null, onDrag: null, onDragEnd: null}。 检测到具有相同值的零个或两个或多个 [DropdownMenuItem] '包:flutter/src/material/dropdown.dart': 断言失败:第 888 行 pos 15:
'items == null || items.isEmpty || value == null ||
items.where((DropdownMenuItem<T> item) {
return item.value == value;
}).length == 1'
DropdownButton(
value: selectedMarker,
onChanged: ((Marker? marker) {
setState(() {
selectedMarker = marker!;
});
print("selectedmarker value ${selectedMarker}");
mapController.moveCamera(CameraUpdate.newLatLng(marker!.position));
}),
items: markers.map((marker) {
return DropdownMenuItem(
value: marker,
child: Text(marker.markerId.value),
);
}).toList(),
),
这是导致错误的下拉按钮小部件。现在我想要实现的是,从菜单中选择一个项目后,地图上的标记被选中。完成了。现在,如果我按下方向按钮,那么标记将跟随折线点。当我按下按钮时,会发生此错误。方向按钮代码如下:
IconButton(
onPressed: () async {
if(selectedMarker.markerId == MarkerId("First Marker")){
controller = AnimationController(
duration: const Duration(milliseconds: 1000),
vsync: this,
);
selectedMarker = markers[0];
for (int i = 0; i < polylinePoints.length && i + 1 != polylinePoints.length; i = i + 1) {
markerAnimation = LatLngTween(
begin: polylinePoints[i],
end: polylinePoints[i + 1])
.animate(controller);
markerAnimation.addListener(() {
setState(() {
Marker marker1 = Marker(markerId: MarkerId("First Marker",
),icon:BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen),
);
print("This is marker1 ${marker1}");
marker1 = marker1.copyWith(
positionParam: markerAnimation.value,
);
///will be right back
markers[0] = marker1;
// _addFirstMarker(Variables.point);
});
});
controller.forward();
await Future.delayed(
const Duration(milliseconds: 50));
}
}
if(selectedMarker.markerId == MarkerId("Second Marker")){
controller = AnimationController(
duration: const Duration(milliseconds: 1000),
vsync: this,
);
selectedMarker = markers[1];
for (int i = 0; i < polylinePoints1.length && i + 1 != polylinePoints1.length; i = i + 1) {
markerAnimation = LatLngTween(
begin: polylinePoints1[i],
end: polylinePoints1[i + 1])
.animate(controller);
markerAnimation.addListener(() {
setState(() {
Marker marker1 = Marker(markerId: MarkerId("Second Marker",
),icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen),
);
marker1 = marker1.copyWith(
positionParam: markerAnimation.value,
);
markers[1] = marker1;
// _addFirstMarker(Variables.point);
});
});
controller.forward();
await Future.delayed(
const Duration(milliseconds: 50));
}
}
if(selectedMarker.markerId == MarkerId("Third Marker")){
controller = AnimationController(
duration: const Duration(milliseconds: 1000),
vsync: this,
); selectedMarker = markers[2];
for (int i = 0; i < polylinePoints2.length && i + 1 != polylinePoints2.length; i = i + 1) {
markerAnimation = LatLngTween(
begin: polylinePoints2[i],
end: polylinePoints2[i + 1])
.animate(controller);
markerAnimation.addListener(() {
setState(() {
Marker marker1 = Marker(markerId: MarkerId("Third Marker",
), icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueGreen),
);
marker1 = marker1.copyWith(
positionParam: markerAnimation.value,
);
markers[2] = marker1;
// _addFirstMarker(Variables.point);
});
});
controller.forward();
await Future.delayed(
const Duration(milliseconds: 50));
}
}
},
icon: Icon(Icons.directions))
一个
value
的DropDownButton
必须存在于项目的值中。
例如,当您点击第一个按钮时
selectedMarker = markers[0];
但是它下面的一些行为其分配了一个新标记
markers[0] = marker1;
现在
selectedMarker
不再存在于markers
中,这是不允许的。我相信应该做
selectedMarker = markers[0];
在你做完之后
markers[0] = marker1;
而不是之前。 和其他的一样。