Flutter找不到速度计的正确提供程序



这是我的小部件构建。

@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 上找不到正确的提供程序

发生这种情况可能是因为您使用了不包括提供程序的BuildContext由您选择。有几个常见的场景:

  • 您试图读取的提供程序处于不同的路径。

    提供者是";scoped";。因此,如果在路由中插入提供者,那么其他路由将无法访问该提供商。

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

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

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

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

另外,考虑一下你的例子:

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

您不应该在构建方法中加载数据——如果加载需要一些时间,您的UI将被冻结,直到加载数据为止。使用类似FutureBuilder的东西来处理它,但这是另一个主题。

相关内容

  • 没有找到相关文章

最新更新