我尝试将Flutter应用程序升级为Provider 4.0.1今天使用,并且以下代码在将值分配为null时崩溃。
Provider 4.0.1
这是我尝试转换的代码。我只改SingleChildCloneableWidget到SingleChildStatelessWidget哪个编译好了。
SingleChildCloneableWidget
SingleChildStatelessWidget
import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; List<SingleChildStatelessWidget> providers = [ ...independentServices, ...dependentServices, ...uiConsumableProviders ]; List<SingleChildStatelessWidget> independentServices = [ Provider.value(value: Api()), Provider.value(value: Tbl()), Provider.value(value: Bill()), Provider.value(value: Sale()), Provider.value(value: Category()), Provider.value(value: Menu()), ]; List<SingleChildStatelessWidget> dependentServices = [ ProxyProvider<Api, AuthenticationService>( update: (context, api, authenticationService) => AuthenticationService(api: api), ), ]; List<SingleChildStatelessWidget> uiConsumableProviders = [ StreamProvider<User>( create: (context) => Provider.of<AuthenticationService>(context, listen: false).user, ), lazy: false ];
我是这样实现的:
StreamController<User> _userController = StreamController<User>(); Stream<User> get user => _userController.stream;
崩溃发生在此行:
Future<void> _setFixedLanguageStrings(BuildContext context) async { User _user = Provider.of<User>(context); _user.homeString = await translate(context, 'Home');
getter“语言”在null上被调用。接收者:null
这可以正常工作,Provider 3.0.3但显然我需要做更多。
Provider 3.0.3
我的原始代码来自 本教程。
编辑:我通过添加lazy: false流提供程序的create方法解决了该问题,但此代码稍后又出现了另一个错误。
lazy: false
Future<String> translate(BuildContext context, _term) async { final String _languageCode = Provider.of<User>(context).language;
产生此错误:
发生异常。_AssertionError(’package:provider / src / provider.dart’:失败的断言:第213行pos 7:’context.owner.debugBuilding || listen == false || _debugIsInInheritedProviderUpdate’:尝试从在小部件树之外。 这可能是由于调用Provider.of的事件处理程序(如按钮的onPressed)导致的,而没有通过listen: false。 要修复,请写:Provider.of(context,listen:false); 它不受支持,因为当窗口小部件树不在乎该值时,可能无意义地重建与事件处理程序关联的窗口小部件。)
发生异常。_AssertionError(’package:provider / src / provider.dart’:失败的断言:第213行pos 7:’context.owner.debugBuilding || listen == false || _debugIsInInheritedProviderUpdate’:尝试从在小部件树之外。
这可能是由于调用Provider.of的事件处理程序(如按钮的onPressed)导致的,而没有通过listen: false。
listen: false
要修复,请写:Provider.of(context,listen:false);
它不受支持,因为当窗口小部件树不在乎该值时,可能无意义地重建与事件处理程序关联的窗口小部件。)
我listen: false在上面的行中添加了似乎已解决该问题的行,但是我尝试使用的下一个提供程序产生了此错误:
尝试从小部件树外部监听提供程序公开的值。 这可能是由于调用Provider.of的事件处理程序(如按钮的onPressed)导致的,而没有通过listen: false。 要修复,请写:Provider.of(context,listen:false); 它不受支持,因为当窗口小部件树不在乎该值时,可能无意义地重建与事件处理程序关联的窗口小部件。’package:provider / src / provider.dart’:失败的断言:213行pos 7:’context.owner.debugBuilding || 听==假|| _debugIsInInheritedProviderUpdate’
尝试从小部件树外部监听提供程序公开的值。
它不受支持,因为当窗口小部件树不在乎该值时,可能无意义地重建与事件处理程序关联的窗口小部件。’package:provider / src / provider.dart’:失败的断言:213行pos 7:’context.owner.debugBuilding || 听==假|| _debugIsInInheritedProviderUpdate’
我现在应该去调用提供者并添加的每个实例listen: false吗?我需要有人来解释发生了什么变化,以及为什么我在Flutter刚起步并且文档稀疏的原因Provider。很多时候,我在代码中调用Provider,而最后一个错误没有返回代码位置。
Provider
是listen: false现在总是在它之前是不是需要或有我错过了什么东西?我开始在实例化Provider变量的每个调用中添加listen:false,它似乎正在工作,但这是正确的方法吗?我应该只添加listen: false到每个通话中Provider.of并每天打电话吗?
Provider.of
该错误表明该应用程序尝试监听小部件树之外的值,但是我不认为是这种情况,因为我在小部件构建方法中调用它。如果此错误是正确的,那么我所有的提供者都在小部件树之外。该代码已经运行了好几个月,监听错误仅在此更新中浮出水面。
我有一个相同的“问题”,如果我在listen: false任何地方都添加了“ 提供程序”,问题就消失了,但我不知道这是否是正确的解决方案…?