这是我的小部件构建。
@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
的东西来处理它,但这是另一个主题。