是否可以将对象传递给上下文?

时间:2020-02-21 13:04:53

标签: flutter dart

我有一个Preferences类,我有一个实例,我想将其传递给构建上下文。我该怎么办?如果这在我所有其他小部件的上下文中也可用,那将是很好的。这可能吗?

class Preferences{
  SpeedNotation speedNotation = SpeedNotation.milesPerHour;

  void writeSettings() async{
    final preferences = await SharedPreferences.getInstance();
    preferences.setInt('speedNotation', speedNotation.index);
  }

  void readSettings() async{
    final preferences = await SharedPreferences.getInstance();
    speedNotation = SpeedNotation.values[preferences.getInt('speedNotation') ?? 1];
    print('speed notation = ' + speedNotation.toString());
  }
}

1 个答案:

答案 0 :(得分:0)

您需要的是InheritedWidget。从Flutter文档中:

小部件的基类,这些小部件可有效地沿树传播信息。

使用InheritedWidget,您可以将要传递给树的信息包装在一个对象中,该对象可以从每个{{1}子级(直接或间接)的小部件的上下文中访问。 }}对象。

以下是一个InheritedWidget的示例,可以应用于您的案例:

InheritedWidget

只要在小部件树中插入class Example extends InheritedWidget { const Example({ Key key, @required this.speedNotation, @required Widget child, }) : assert(speedNotation != null), assert(child != null), super(key: key, child: child); final SpeedNotation speedNotation; static Example of(BuildContext context) { return context.dependOnInheritedWidgetOfExactType<Example>(); } @override bool updateShouldNotify(Example old) => speedNotation != old.speedNotation; } 即可,您只需执行以下操作:

InheritedWidget

要从树下的任何位置访问final example = Example.of(context); final speedNotation = example.speedNotation ,只要您使用的speedNotation在其上方的某个位置具有context继承的小部件即可。