Flutter/Dart空安全适配:如何修改自定义类使其符合空安全规范
Flutter空安全迁移BlocProvider类修改方案
报错对应修改说明
- 前两个
missing_default_value_for_parameter报错:空安全下可选命名参数默认可空,旧版本的@required注解已经废弃,需要替换为Dart内置的required关键字标记参数为必填,避免参数被隐式赋值为null。 - 第三个
invalid_assignment报错:context.findAncestorWidgetOfExactType返回值为可空类型BlocProvider<T>?,需要增加空校验或非空断言(确定BlocProvider一定存在于父节点的场景下可直接用!断言,也可以自定义异常提示便于排查问题)。 - 第四个
unchecked_use_of_nullable_value报错:sponsors_stagiaire_tab.dart第147行调用length的接收者为可空类型,按需选择以下方案修复即可:- 确认对应变量不会为null时,在变量后加非空断言
!,例如list!.length - 用空安全调用符+默认值兜底,例如
list?.length ?? 0 - 调用
length前提前做非空判断,Dart会自动将变量提升为非空类型
- 确认对应变量不会为null时,在变量后加非空断言
修改后的完整BlocProvider代码
import 'package:flutter/cupertino.dart'; import 'blocs.dart'; class BlocProvider<T extends Bloc> extends StatefulWidget { final T bloc; final Widget child; // 替换旧@required注解为内置required关键字,可选添加super.key参数 const BlocProvider({super.key, required this.bloc, required this.child}); static T of<T extends Bloc>(BuildContext context) { // 可直接用!非空断言,也可替换为下方自定义异常的写法 final BlocProvider<T> _provider = context.findAncestorWidgetOfExactType<BlocProvider<T>>()!; return _provider.bloc; // 自定义异常提示写法(更便于排查未找到BlocProvider的问题) // final BlocProvider<T>? _provider = // context.findAncestorWidgetOfExactType<BlocProvider<T>>(); // if (_provider == null) { // throw StateError('No BlocProvider of type $T found in current context'); // } // return _provider.bloc; } // 补充泛型约束 @override State<BlocProvider<T>> createState() => _BlocProviderState<T>(); } // 补充泛型约束 class _BlocProviderState<T extends Bloc> extends State<BlocProvider<T>> { @override Widget build(BuildContext context) { return widget.child; } @override void dispose() { widget.bloc.dispose(); super.dispose(); } }
内容的提问来源于stack exchange,提问作者user3701584
相关产品推荐
相关产品推荐

