Flutter не находит Провидер <DirectionProvider>

как они идут? я работаю с Google Maps, в этой возможности, встречаюсь со следующей ошибкой: (Provider)

[ERROR:flutter/lib/ui/ui_dart_state.cc (157)] Унандлед Экссептион: Ошибка: Could not find the correct Provider above this Гооглемапс Видхет

И класс, с которым я работаю, - следующий: (часть, чтобы не делать ее длинной):

import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:provider/provider.dart';
import 'DirectionProvider.dart';
import 'package:geolocator/geolocator.dart';

class GoogleMaps extends StatefulWidget {
  final String x, y;
  GoogleMaps(this.x, this.y);
  final LatLng fromPoint = LatLng(-37.020125, -62.409388);
  @override
  _GoogleMapsState createState() => _GoogleMapsState();
}

class _GoogleMapsState extends State<GoogleMaps> {
  Position _currentPosition;
  LatLng toPoint;
  void initState() {
    _getCurrentLocation();
    var x2 = double.parse(widget.x);
    var y2 = double.parse(widget.y);
    toPoint = new LatLng(x2, y2);
    super.initState();
  }

  GoogleMapController _mapController;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Maps'),
      ),
      body: ChangeNotifierProvider(
          create: (_) => new DirectionProvider(),
          child: Builder(
              builder: (context) => Consumer<DirectionProvider>(
                    builder: (BuildContext context, DirectionProvider api,
                        Widget child) {
                      return GoogleMap(
                        initialCameraPosition: CameraPosition(
                          target: widget.fromPoint,
                          zoom: 12,
                        ),
                        markers: _createMarkers(),
                        polylines: api.currentRoute,
                        onMapCreated: _onMapCreated,
                        myLocationEnabled: true,
                        myLocationButtonEnabled: true,
                      );
                    },
                  ))),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.zoom_out_map),
        onPressed: _centerView,
      ),
    );
  }

  Set<Marker> _createMarkers() {
    var tmp = Set<Marker>();

    tmp.add(Marker(
      markerId: MarkerId("FromPoint"),
      position: widget.fromPoint,
      infoWindow: InfoWindow(title: "estoy aca"),
    ));

    tmp.add(Marker(
      markerId: MarkerId("toPoint"),
      position: toPoint,
      infoWindow: InfoWindow(title: "llegada"),
    ));
    return tmp;
  }

  void _onMapCreated(GoogleMapController controller) {
    _mapController = controller;

    _centerView();
  }

  _centerView() async {
    var api = Provider.of<DirectionProvider>(context);

    await _mapController.getVisibleRegion();

    print("buscando direcciones");
    await api.findDirections(widget.fromPoint, toPoint);

    var left = min(
        widget.fromPoint.latitude, toPoint.latitude); //SE CALCULA COORDENADAS.
    var right = max(widget.fromPoint.latitude, toPoint.latitude);
    var top = max(widget.fromPoint.longitude, toPoint.longitude);
    var bottom = min(widget.fromPoint.longitude, toPoint.longitude);

    api.currentRoute.first.points.forEach((point) {
      left = min(left, point.latitude);
      right = max(right, point.latitude);
      top = max(top, point.longitude);
      bottom = min(bottom, point.longitude);
    });

    var bounds = LatLngBounds(
      southwest: LatLng(left, bottom),
      northeast: LatLng(right, top),
    );
    var cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 50);
    _mapController.animateCamera(cameraUpdate);
  }

  _getCurrentLocation() {
    var geolocator = Geolocator();
    var locationOptions = LocationOptions(accuracy: LocationAccuracy.high, distanceFilter: 10);

    StreamSubscription<Position> positionStream = geolocator.getPositionStream(locationOptions).listen((Position position) {
          print(position == null ? 'Unknown' : position.latitude.toString() + ', ' + position.longitude.toString());
        });
  }
}

Я не могу находить, искренне ошибка. Большое спасибо заранее. Уже Выполните Флуттер Клеан. Также - класс DirectionProvider, но в этой, просто этой в api key и вычисляется, который является лучшей дорожкой, чтобы прибывать в судьбу.

(я становлюсь отвечающим современным требованиям)

0
задан 28.12.2019, 22:13
1 ответ

То, за чем оно последует, состоит в том, что estГЎs используя Consumer прямо в том же контексте Provider, которые ты создал, это podrГ-схвати решать нескольких форм, одна из них состоит в том, чтобы ты объявил ChangeNotifierProvider на widget, который ты считаешь объявленным в твоем вопросе (как parent).

Другой состоит в том, чтобы ты использовал widget Builder, чтобы создавать новый контекст.

           body:ChangeNotifierProvider(
           create: (_) => new DirectionProvider(),
           child: Builder(
              builder : (context) => Consumer<DirectionProvider>(
             builder:
                 (BuildContext context, DirectionProvider api, Widget child) {
               return GoogleMap(
                 initialCameraPosition: CameraPosition(
                   target: widget.fromPoint,
                   zoom: 12,
                 ),
                 markers: _createMarkers(),
                 polylines: api.currentRoute,
                onMapCreated: _onMapCreated,
                 myLocationEnabled: true,
                 myLocationButtonEnabled: true,
              );
             },
           ),
  ) ,
)

UPDATED

Проблема, которая у тебя есть, - из-за контекста, как я это сказал ранее, estГЎs используя Provider.of с локальным контекстом, чтобы решать проблему, способ mГЎs подходящая состоит в том, чтобы доставать ChangeNotifierProvider и помещать это наверху, сейчас чтобы называть widget google maps, уже ты это не делаешь:

GoogleMaps(123, 456)

а это

GoogleMaps.init(123,456)
import 'dart:async';
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:provider/provider.dart';
import 'DirectionProvider.dart';
import 'package:geolocator/geolocator.dart';

class GoogleMaps extends StatefulWidget {
  final String x, y;
  GoogleMaps(this.x, this.y);

 static ChangeNotifierProvider init(double x, double y) =>  ChangeNotifierProvider(
          create: (_) => new DirectionProvider(),
          child; GoogleMaps(x,y);
          );


  final LatLng fromPoint = LatLng(-37.020125, -62.409388);
  @override
  _GoogleMapsState createState() => _GoogleMapsState();
}

class _GoogleMapsState extends State<GoogleMaps> {
  Position _currentPosition;
  LatLng toPoint;
  void initState() {
    _getCurrentLocation();
    var x2 = double.parse(widget.x);
    var y2 = double.parse(widget.y);
    toPoint = new LatLng(x2, y2);
    super.initState();
  }

  GoogleMapController _mapController;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Google Maps'),
      ),
      body:  Consumer<DirectionProvider>(
                    builder: (BuildContext context, DirectionProvider api,
                        Widget child) {
                      return GoogleMap(
                        initialCameraPosition: CameraPosition(
                          target: widget.fromPoint,
                          zoom: 12,
                        ),
                        markers: _createMarkers(),
                        polylines: api.currentRoute,
                        onMapCreated: _onMapCreated,
                        myLocationEnabled: true,
                        myLocationButtonEnabled: true,
                      );
                    },
                  ),
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.zoom_out_map),
        onPressed: _centerView,
      ),
    );
  }

  Set<Marker> _createMarkers() {
    var tmp = Set<Marker>();

    tmp.add(Marker(
      markerId: MarkerId("FromPoint"),
      position: widget.fromPoint,
      infoWindow: InfoWindow(title: "estoy aca"),
    ));

    tmp.add(Marker(
      markerId: MarkerId("toPoint"),
      position: toPoint,
      infoWindow: InfoWindow(title: "llegada"),
    ));
    return tmp;
  }

  void _onMapCreated(GoogleMapController controller) {
    _mapController = controller;

    _centerView();
  }

  _centerView() async {
    var api = Provider.of<DirectionProvider>(context);

    await _mapController.getVisibleRegion();

    print("buscando direcciones");
    await api.findDirections(widget.fromPoint, toPoint);

    var left = min(
        widget.fromPoint.latitude, toPoint.latitude); //SE CALCULA COORDENADAS.
    var right = max(widget.fromPoint.latitude, toPoint.latitude);
    var top = max(widget.fromPoint.longitude, toPoint.longitude);
    var bottom = min(widget.fromPoint.longitude, toPoint.longitude);

    api.currentRoute.first.points.forEach((point) {
      left = min(left, point.latitude);
      right = max(right, point.latitude);
      top = max(top, point.longitude);
      bottom = min(bottom, point.longitude);
    });

    var bounds = LatLngBounds(
      southwest: LatLng(left, bottom),
      northeast: LatLng(right, top),
    );
    var cameraUpdate = CameraUpdate.newLatLngBounds(bounds, 50);
    _mapController.animateCamera(cameraUpdate);
  }

  _getCurrentLocation() {
    var geolocator = Geolocator();
    var locationOptions = LocationOptions(accuracy: LocationAccuracy.high, distanceFilter: 10);

    StreamSubscription<Position> positionStream = geolocator.getPositionStream(locationOptions).listen((Position position) {
          print(position == null ? 'Unknown' : position.latitude.toString() + ', ' + position.longitude.toString());
        });
  }
}

я рекомендую Тебе пересматривать хорошо концепцию StatefulWidget перед тем, как происходить с Provider, и tambiГ©n я перемещаю тебя соединение канала youtube, который у меня есть вместе с другом Мексики, где мы говорим о Стате Манахемент: https://www.youtube.com/c/TheDartSide

0
ответ дан 29.12.2019, 09:10
  • 1
    Привет diego, я сделал второе, даже así сохраняется проблема. Больше деталей ошибки: – gisela 28.12.2019, 20:13
  • 2
    Could not find the correct Provider< DirectionProvider> above this Гооглемапс Видхет To fix, please: * Ensure the Provider< DirectionProvider> is an ancestor to this Гооглемапс Видхет * Provide types to Provider< DirectionProvider> * Provide types to Consumer< DirectionProvider> * Provide types to Provider.of< DirectionProvider> () * Always использовал package imports. Экс-: import 'package:my_app/my_code.dart'; * Ensure the correct context' is being used. If none of these solutions work, please file в вирус at: github.com/rrousselGit/provider/issues – gisela 28.12.2019, 20:15
  • 3
    Ты можешь помещать твой полный код с correcció n, что agregué обнови твой вопрос – diegoveloper 28.12.2019, 21:15
  • 4
    я заношу в список. Там я поместил полный класс – gisela 28.12.2019, 22:14
  • 5
    уже actualicé мой ответ – diegoveloper 28.12.2019, 22:21