繁体   English   中英

Flutter 中的提供程序出现错误“无法在此 X Widget 上方找到正确的提供程序”

[英]Provider in Flutter with error "Could not find the correct provider above this X Widget"

我正在尝试在urlTemplate上创建动态地图路径,但是, Provider (又名provider抛出此错误。 请参考附图)。

在其他页面中, provider工作正常,但在此页面上除外。 我想知道为什么在我的情况下使用Provider.of(context)不起作用的问题。

关于这个的任何想法? 我整夜都在寻找这个,但没有任何运气。

import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:latlong/latlong.dart';
import 'package:provider/provider.dart';
import 'package:user_location/user_location.dart';
import '../model/events.dart';

class MapBox extends StatefulWidget {
  final GlobalKey<ScaffoldState> scaffoldState = GlobalKey();
  @override
  _MapBoxState createState() => _MapBoxState();
}

class _MapBoxState extends State<MapBox> {
  MapController mapController = MapController();
  UserLocationOptions userLocationOptions;
  List<Marker> markers = [];

  @override
  Widget build(BuildContext context) {
    final events = Provider.of<Events>(context);
    final String maps = "${events.itmaps}";
    final String title = "${events.title}";
    userLocationOptions = UserLocationOptions(
      context: context,
      mapController: mapController,
      markers: markers,
    );
    return new Scaffold(
      appBar: new AppBar(title: new Text('title')),
      body: Stack(
        children: <Widget>[
          new FlutterMap(
            options: new MapOptions(
              center: new LatLng(46.185, 12.963),
              minZoom: 14.0,
              plugins: [
                // ADD THIS
                UserLocationPlugin(),
              ],
            ),
            layers: [
              new TileLayerOptions(
                urlTemplate: maps,
                additionalOptions: {
                  'accessToken':
                      '<XXX>',
                  'id': 'mapbox.mapbox-streets-v7'
                },
              ),
              MarkerLayerOptions(markers: markers),
              userLocationOptions,
            ],
            mapController: mapController,
          ),
        ],
      ),
    );
  }
}

在此处输入图片说明

这是我的Events类:

class Events { 
   final String imagePath, title, itmaps;
   Events({this.imagePath, this.title, this.itmaps}); 
}

您可能想分享在何处以及如何“提供” Events对象的实例/值。

显然,错误消息指出它正在寻找提供Events的祖先,或者至少是 MapBox 的父小部件。

假设您的Events应该在您的应用程序中全局使用,您可以执行以下操作:

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

class Events {
  final String imagePath, title, itmaps;
  Events({this.imagePath, this.title, this.itmaps});
}

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // Creating an instance of events
  Events _declaredEvents = Events(
    imagePath: "https://somepath.com",
    title: "sometitle",
    itmaps: "somemaps",
  );

  @override
  Widget build(BuildContext context) {
    return Provider(
      create: (_) => _declaredEvents, // IMPORTANT: Create the object to be provided
      child: MaterialApp(
        home: FirstPage(),
      ),
    );
  }
}

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // Based on the context of this page, look for the type `Events` that was provided by the top level widget/s
    Events _providedEvents = Provider.of<Events>(context);
    return Scaffold(
      body: Center(
        child: Text(_providedEvents.title), // Utilised the provided object here
      ),
    );
  }
}

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM