【问题标题】:Flutter - Builder null on navigation pushFlutter - 导航推送上的 Builder null
【发布时间】:2019-07-20 00:40:12
【问题描述】:

我在地图中有一组标记。当点击其中一个标记时,会显示显示元素名称和“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/颤振 (11498):在构建 Builder(dirty) 时抛出了以下断言: 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)));

【问题讨论】:

  • 这是因为你的 builder 去了这里:: null
  • 是的,我知道。但是我该如何解决呢?
  • 如果在调用Navigator.push( 之前先调用print('objeto[0][2]: ${objeto[0][2]}'),你会看到什么?

标签: google-maps flutter


【解决方案1】:

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

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
      }

【讨论】:

  • 我找到了解决方案。
猜你喜欢
  • 2021-06-17
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
相关资源
最近更新 更多