0

我正在尝试使用继承的小部件在所有屏幕上共享相同的服务。

这是我的继承小部件的代码

class GlobalValues extends InheritedWidget {
  final AudioProvider audioProvider;

  GlobalValues({Key key, Widget child, this.audioProvider}) : super(key: key, child: child);

  static AudioProvider of(BuildContext context){
    return (context.dependOnInheritedWidgetOfExactType<GlobalValues>()).audioProvider;
  }

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) {
    return false;
  }
}

因此,我在主屏幕中对其进行了初始化:

@override
  Widget build(BuildContext context) {
    double width = MediaQuery.of(context).size.width;

    return GlobalValues(
      audioProvider: AudioProvider(),
      child: StreamBuilder<MapEntry<Position, List<MuseumCard>>>(...)
    );
  }

最后我想从后续屏幕访问它:

@override
  Widget build(BuildContext context) {
    super.build(context);
    AudioProvider audioProvider = GlobalValues.of(context);
    Return Scaffold(...);
  }

但是当最后一个屏幕被构建时,我收到了这个错误消息

在 null 上调用了 getter 'audioProvider'。接收方:null 尝试调用:audioProvider

我注意到,如果我在 main.dart 中初始化小部件,则错误不会出现并且一切正常

@override
  Widget build(BuildContext context) {
    return GlobalValues(
      audioProvider: AudioProvider(),
      child: MaterialApp(...),);
  }

但我想让它只在小部件子树的某个部分可用,但不知道为什么它不起作用。

可能是由于屏幕之间的路由吗?或者还有什么其他原因?

谢谢

4

1 回答 1

0

访问时更改您的代码,如下所示。你错过了给audioProvider班级成员打电话。

  @override
  Widget build(BuildContext context) {
    super.build(context);
    AudioProvider audioProvider = GlobalValues.of(context).audioProvider;
    Return Scaffold(...);
  }
于 2020-06-14T17:08:00.957 回答