Dart中Bool(原生bool)与bool的使用差异及适用场景咨询
Dart中
bool与Bool的差异及适用场景 核心问题说明
你代码里的报错根源是混淆了Dart的原生布尔类型和非原生的Bool类:Dart语言没有名为Bool的原生内置类型,小写的bool才是官方定义的原生布尔类型;大写的Bool通常是第三方库(如dart:ffi)或自定义的包装类,和原生bool不属于同一类型体系,因此SharedPreferences.getBool()返回的bool值无法直接赋值给Bool类型变量。
二者核心差异
- 类型归属:
bool是Dart语言内置的基础数据类型,属于语言核心语法,所有Dart代码无需引入额外依赖即可直接使用。Bool不是原生类型,一般是特定库提供的类(比如dart:ffi中用于跨C语言调用的类型),或是开发者自定义的封装类。
- 取值与特性:
- 原生
bool只有true和false两个不可变常量,是极简的布尔标识。 Bool作为类,内部通常持有一个bool值,可能附带额外的方法、属性或序列化逻辑。
- 原生
- API兼容性:
- Dart标准库(包括
SharedPreferences)的所有布尔相关API都使用原生bool类型,不会返回Bool实例。
- Dart标准库(包括
各自适用场景
bool:日常开发的默认选择
所有常规Dart业务逻辑都应该用bool,比如条件判断、状态标记、函数返回值、存储数据的布尔标识等。你代码里的getBool方法能正常工作,就是因为它的返回类型和SharedPreferences的返回值类型匹配。Bool:仅用于特定小众场景
只有在特殊需求下才会用到Bool类,比如:- 基于
dart:ffi与C语言交互时,C的布尔类型需要对应dart:ffi库中的Bool类型,用于跨语言传递布尔值; - 极少数自定义封装场景,比如需要给布尔值添加扩展行为(如自定义序列化规则)时,才会封装
Bool类,但这种情况非常少见。
- 基于
代码修复建议
如果你的PrefApi抽象类中getNativeBool方法的意图是返回原生布尔值,直接把返回类型改为bool即可:
abstract class PrefApi{ const PrefApi(); bool getNativeBool(String key); // 改为小写bool bool getBool(String key); }
如果确实需要使用Bool类型(比如dart:ffi场景),需要手动完成类型转换,例如:
import 'dart:ffi'; @override Bool getNativeBool(String key) => Bool.fromValue(_plugin.getBool(key)! ? 1 : 0);
内容的提问来源于stack exchange,提问作者jadekim
相关产品推荐
相关产品推荐

