gpt4 book ai didi

flutter - InheritedWidget 在小部件树 Flutter 中将数据作为空值提供

转载 作者:IT王子 更新时间:2023-10-29 07:11:23 26 4
gpt4 key购买 nike

我正在尝试将数据从一个小部件传递到树下的另一个小部件。这是我从一个屏幕导航到另一个屏幕的代码:

final page = LanguagePreferenceProvider(child: UserNameScreen(),language: _currentNationality,);
navigate(context, page);

navigate() 方法:

void navigate(BuildContext context, Widget page) {
Navigator.pushReplacement(
context,
PageRouteBuilder(
pageBuilder: (context, anim1, anim2) => page,
transitionsBuilder: (context, anim1, anim2, child) {
return SlideTransition(
position: Tween<Offset>(
end: Offset(0, 0), begin: Offset(1, 0))
.animate(anim1),
child: page,
);
},
),
);
}

现在在另一个屏幕中,我正在使用它来获取值:

@override
void didChangeDependencies() {
super.didChangeDependencies();
_selectedLanguage = LanguagePreferenceProvider.of(context).language;

我的 InheritedWidget 类:

class LanguagePreferenceProvider extends InheritedWidget{
final String language;

LanguagePreferenceProvider({
Widget child,
this.language,
}) : super(child: child);

@override
bool updateShouldNotify(LanguagePreferenceProvider oldWidget) => language != oldWidget.language;

static LanguagePreferenceProvider of(BuildContext context) => context.inheritFromWidgetOfExactType(LanguagePreferenceProvider);
}

但我收到以下错误:

The getter 'language' was called on null.

最佳答案

实际上,null 不是 language,而是 LanguagePreferenceProvider。根据您的示例,我可以推断出发生这种情况的可能情况。

您有一个可能如下所示的小部件树:

- MaterialApp
+ Navigator
+ LanguagePreferenceProvider
+ SomeUiWidgets

注意:默认情况下,MaterialApp 中有一个 Navigator。

每当您将路线推送到 Navigator 时,它的 child 就会消失。完全替换或下推路由堆栈。在任何一种情况下,查找 LanguagePreferenceProvider.of(context) 可能会导致 null 值,如果新路由的小部件树不包含一个。

要解决此问题,您可以“提升状态”,将继承的小部件移动到导航器上方。这样,更换路线不会破坏它。这是一种使用 InheritedWidget 跨路由保持状态的方法。

关于flutter - InheritedWidget 在小部件树 Flutter 中将数据作为空值提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56413575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com