【问题标题】:Flutter Could Not Find Correct Provider with SpeedometerFlutter 无法使用 Speedometer 找到正确的提供者
【发布时间】:2021-08-09 22:02:38
【问题描述】:

这是我的小部件构建。

@override
Widget build(BuildContext context) {
final providerData = Provider.of<SpeedometerProvider>(context);
providerData.getSpeedUpdates();

这是我的提供者

class SpeedometerProvider with ChangeNotifier {
Speedometer _speedometer =
  new Speedometer(currentSpeed: 0);

Speedometer get speedometer => _speedometer;
Stopwatch _stopwatch = Stopwatch();
final Geolocator _geolocator = Geolocator();

....

这是我的屏幕

SafeArea(

            child: Column(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Padding(

                    padding: const EdgeInsets.only(
                        right: 200.0, top: 550.0),
                    child: Center(
                        child: Column(children: <Widget>[
                          Text("Anlık HIZ",
                              style: Theme
                                  .of(context)
                                  .textTheme
                                  .bodyText1),
                          SevenSegmentDisplay(
                              value:
                              '${providerData.speedometer.currentSpeed
                                  .toStringAsFixed(0)}',
                              size: 4,
                              backgroundColor: Colors.white,
                              segmentStyle: HexSegmentStyle(
                                  enabledColor: Colors.green,
                                  disabledColor: Colors.white)),

                          Text("Kmh", style: Theme
                              .of(context)
                              .textTheme
                              .bodyText1)

                        ])),

这是错误: 错误:在此 MapView Widget 上方找不到正确的 Provider

这可能是因为您使用了不包含提供程序的BuildContext 你的选择。有几种常见的情况:

  • 您尝试读取的提供程序位于不同的路径中。

    提供者是“范围的”。因此,如果您在路线内插入提供者,那么 其他路由将无法访问该提供程序。

  • 您使用了BuildContext,它是您尝试读取的提供程序的祖先。

【问题讨论】:

    标签: flutter flutter-provider flutter-widget


    【解决方案1】:

    在您的 build() 方法中使用提供的值之前,您应该先创建它并将其提供给您的小部件树:

    ChangeNotifierProvider(
      create: (_) => SpeedometerProvider(),
      child: ...
    )
    

    您可以在根级别提供它或根据您的示例提供它,您可以简单地用它包装您的 SafeArea 小部件。

    另外,考虑你的例子:

    Widget build(BuildContext context) {
    final providerData = Provider.of<SpeedometerProvider>(context);
    providerData.getSpeedUpdates();
    

    您不应该在 build 方法中加载数据 - 如果此加载需要一些时间,您的 UI 将被冻结,直到加载数据。使用 FutureBuilder 之类的东西来处理它,但这是一个不同的主题。

    【讨论】:

    • 感谢您的回答,但我有一个问题。我可以在哪里写作而不是在建筑物中写作?因为我必须定义。我找不到另一个地方。我是 Flutter 的新手。
    • 不确定,这取决于您的应用程序结构、状态管理等。如果您只需要加载该数据一次,最简单的解决方案是使用 StatefulWidget 并在 initState 中执行此操作。
    猜你喜欢
    • 2019-12-23
    • 2021-02-19
    • 2021-04-04
    • 2023-01-26
    • 2021-01-06
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多