如何确保用户不会将 null 变量传递给 Flutter 插件?
How to ensure user does not pass null variable to Flutter plugin?
假设,在 Dart/Flutter 中,您正在设计一个插件 API 具有如下功能:
static Future<void> startPlaying(Uint8List bytes) async {
_channel.invokeMethod('playBytes', bytes);
}
如果说由于 Dart 的 null 安全特性,我们不对插件用户将 'bytes' 参数作为 null 传入的事件负责(因此导致运行时崩溃)因为为了这样做,他们必须显式地解包一个可为空的变量,从而保证它不是空的。
或者...我们是否应该做一些其他事情,例如抛出异常?
第一个:
如果您指的是在设备上使用应用程序的最终用户,您应该有一个 validation
用于输入。
第二个:
如果您的意思是有人尝试使用您的插件来编写应用程序代码。
你可以添加 required
关键字,如果不通过 bytes
.
则飞镖分析会给用户错误
static Future<void> startPlaying({required Uint8List bytes}) async {
_channel.invokeMethod('playBytes', bytes);
}
使用 sound 空安全,无法以 null
作为参数调用该方法。
有了 不可靠的 空安全,如果不是你的程序的每个库都选择了空安全,这就是你得到的,技术上可以将 null
作为参数(因为 non-null 安全库可能正在执行调用,或者可能将 null
传递给其他空安全代码,因为它假定空安全而不会检查。)
您可以选择检查传入的值,作为额外的预防措施。
该语言使您很难做到这一点,因为代码在本地看起来是空安全的。
像
if (bytes as dynamic == null) throw ArgumentError.notNull("bytes");
我个人不会为此烦恼,除非如果 null
设法进入代码,确实存在出现严重错误的风险。
它被记录为不允许 null
值,大多数 well-behaved 代码都会遵守这一点。最终,当所有程序都完全安全时,该检查将只是死代码。
假设,在 Dart/Flutter 中,您正在设计一个插件 API 具有如下功能:
static Future<void> startPlaying(Uint8List bytes) async {
_channel.invokeMethod('playBytes', bytes);
}
如果说由于 Dart 的 null 安全特性,我们不对插件用户将 'bytes' 参数作为 null 传入的事件负责(因此导致运行时崩溃)因为为了这样做,他们必须显式地解包一个可为空的变量,从而保证它不是空的。
或者...我们是否应该做一些其他事情,例如抛出异常?
第一个:
如果您指的是在设备上使用应用程序的最终用户,您应该有一个 validation
用于输入。
第二个:
如果您的意思是有人尝试使用您的插件来编写应用程序代码。
你可以添加 required
关键字,如果不通过 bytes
.
static Future<void> startPlaying({required Uint8List bytes}) async {
_channel.invokeMethod('playBytes', bytes);
}
使用 sound 空安全,无法以 null
作为参数调用该方法。
有了 不可靠的 空安全,如果不是你的程序的每个库都选择了空安全,这就是你得到的,技术上可以将 null
作为参数(因为 non-null 安全库可能正在执行调用,或者可能将 null
传递给其他空安全代码,因为它假定空安全而不会检查。)
您可以选择检查传入的值,作为额外的预防措施。 该语言使您很难做到这一点,因为代码在本地看起来是空安全的。 像
if (bytes as dynamic == null) throw ArgumentError.notNull("bytes");
我个人不会为此烦恼,除非如果 null
设法进入代码,确实存在出现严重错误的风险。
它被记录为不允许 null
值,大多数 well-behaved 代码都会遵守这一点。最终,当所有程序都完全安全时,该检查将只是死代码。