我有一个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());
}
}
答案 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
继承的小部件即可。