首页 > 解决方案 > 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-awaitbuilder:(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)));

标签: google-mapsflutter

解决方案


好吧,您在构建器中返回了一个空小部件,这是不允许的,因为框架告诉您。您可以通过您的逻辑来解决此更改,以决定用户走哪条路线。

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
      }

推荐阅读