You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例。

各自适用场景

  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:15:03