google-maps - Flutter - 导航推送上的 Builder null
问题描述
我在地图中有一组标记。当点击其中一个标记时,会显示显示元素名称和“Ver”(显示)按钮的小吃栏。当我单击此按钮时,理论上会转到其他页面。我有这个代码。
void onMapCreated(GoogleMapController controller) async {
setState(() {
mapController = controller;
markerMap = Map();
});
for (int i = 0; i < list.length; i++) {
var corte = list[0].keys.elementAt(i).split('/');
Marker marker = await mapController.addMarker(MarkerOptions(
position: LatLng(list[0].values.elementAt(i).latitude,
list[0].values.elementAt(i).longitude),
icon: BitmapDescriptor.defaultMarkerWithHue(
corte[1] == "tipo:0"
? BitmapDescriptor.hueRed
: corte[1] == "tipo:4"
? BitmapDescriptor.hueBlue
: corte[1] == "tipo:3"
? BitmapDescriptor.hueGreen
: corte[1] == "tipo:2"
? BitmapDescriptor.hueYellow
: null)));
markerMap[marker.id] = [corte,i];
}
mapController.onMarkerTapped.add((marker) {
scaffoldKey.currentState.removeCurrentSnackBar();
var objeto = markerMap[marker.id];
final snackBar = SnackBar(
duration: Duration(seconds: 10),
content: Text(objeto[0][0], textAlign: TextAlign.left),
backgroundColor: Colors.red[700],
action: SnackBarAction(
textColor: Colors.white,
label: 'Ver',
onPressed: () {
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) => objeto[0][2] == "tipo:0"
? new MeterDetailsChartPage(
elemento: metersDetails[objeto[1]],
estate: this.estate,
parcela: widget.parcela)
: objeto[0][2] == "tipo:4"
? new ValvePage(
elemento: valvesDetails[objeto[1]],
estate: this.estate,
parcela: widget.parcela)
: objeto[0][2] == "tipo:3"
? new RelePage(
elemento: relesDetails[objeto[1]],
estate: this.estate,
parcela: widget.parcela)
: objeto[0][2] == "tipo:2"
? new SensorPage(
elemento: sensorsDetails[objeto[1]],
estate: this.estate,
parcela: widget.parcela)
: null));
},
));
scaffoldKey.currentState.showSnackBar(snackBar);
});
}
问题:当我单击“版本”时返回此错误
I/flutter (11498):══╡小部件库发现异常╞══════════════════════════════════════════════ ═════════════════════════ I/flutter(11498):在构建Builder(脏)时抛出了以下断言:I/flutter(11498):路线“null”的构建器返回 null。
我认为问题出在async-await和builder:(context)上。
有人有这个问题,知道如何解决吗?
- 解决方案 -
Navigator.push(
context,
new MaterialPageRoute(
builder: (context) => objeto[1] == "tipo:0"
? new MeterDetailsChartPage(
elemento: metersDetails.firstWhere((meters)=>meters.id==int.parse(objeto[2])),
estate: this.estate,
parcela: widget.parcela)
: objeto[1] == "tipo:4"
? new ValvePage(
elemento: valvesDetails.firstWhere((valves)=>valves.id==int.parse(objeto[2])),
estate: this.estate,
parcela: widget.parcela)
: objeto[1] == "tipo:3"
? new RelePage(
elemento: relesDetails.firstWhere((reles)=>reles.id==int.parse(objeto[2])),
estate: this.estate,
parcela: widget.parcela)
: objeto[1] == "tipo:2"
? new SensorPage(
elemento: sensorsDetails.firstWhere((sensors)=>sensors.id==int.parse(objeto[2])),
estate: this.estate,
parcela: widget.parcela)
:Navigator.pushNamed(context, EstatesPage.tag)));
解决方案
好吧,您在构建器中返回了一个空小部件,这是不允许的,因为框架告诉您。您可以通过您的逻辑来解决此更改,以决定用户走哪条路线。
var myNextRoute = objeto[0][2] == "tipo:0"
? new MeterDetailsChartPage(
elemento: metersDetails[objeto[1]],
estate: this.estate,
parcela: widget.parcela )
: objeto[0][2] == "tipo:4"
? new ValvePage(
elemento: valvesDetails[objeto[1]],
estate: this.estate,
parcela: widget.parcela )
: objeto[0][2] == "tipo:3"
? new RelePage(
elemento: relesDetails[objeto[1]],
estate: this.estate,
parcela: widget.parcela)
: objeto[0][2] == "tipo:2"
? new SensorPage(
elemento: sensorsDetails[objeto[1]],
estate: this.estate,
parcela: widget.parcela)
: null; //this null in your current logic is the problem
//because sometimes you will returning null in your build method. In this snippet we're avoiding this.
// avoiding pass a null widget to MaterialPageRoute.
if (myNextRoute != null)
Navigator.push( context,
new MaterialPageRoute(
builder: (context) => myNextRoute )
else {
// you can't go to a nextRoute
}
推荐阅读
- java - 使用 /src/resources 作为新包的源目录
- android - 我们应该使用 Constraintlayout 作为 Recyclerview 项目布局吗?
- php - Big Sur 并安装 msodbcsql17
- sql - 如何遍历表名列表并查看列中的特定值是否存在?
- amazon-web-services - Terraform AWS IAM 用户在备用 terraform 应用命令上从 IAM 组中添加和删除
- swift - Swift - AVAudioEngine 无法默认为系统输出
- aspnetboilerplate - 如何将 abp 5.14 升级到 abp 6.0?
- vba - VBA 在继续之前检查页面上是否存在 HTMLDivElement
- python - 熊猫数据框样式格式行
- ssl - 当有 1 个密钥和 1 个 pem 时将 pem 密钥转换为 p12