Flutter - Builder обнуляется при нажатии кнопки навигации - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть массив маркеров на карте. При нажатии на один из этих маркеров отображается снэк-панель с названием элемента и кнопкой «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);  
          });
        }

Проблема: Когда я щелкаю в 'Ver', возвращается эта ошибка

I / flutter (11498): ══C ИСКЛЮЧЕНИЕ ЗАДАНО БИБЛИОТЕКОЙ ВИДЖЕТОВ ╞═══════════════════════════════════════════════════════════ I / flutter (11498): было выброшено следующее утверждение. Building (грязный): I / flutter (11498): строитель для маршрута "null" возвратил null.

Я думаю, что проблема с async-await и builder: (контекст) .

У кого-нибудь есть эта проблема и знаете, как ее исправить?

- РЕШЕНИЕ -

  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)));

1 Ответ

0 голосов
/ 26 февраля 2019

Ну, вы возвращаете нулевой виджет внутри вашего компоновщика, это не разрешено, как говорит фреймворк.Вы можете решить эту перемену немного вашей логикой о том, по какому маршруту пойдет пользователь.

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
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...