这是 todoline++ 项目开发过程中遇到的问题系列, 记录下来供大家参考。
本篇记录一些异常!
01) A value of type ‘Null’ can’t be assigned to a parameter of type ‘String’ in a const constructor.
1 | Container( |
dart 语言定义变量的时候, 在数据类型加问好(?), 就表示允许该变量为 null, 否则不允许变量为 null, 如果一个变量为 null, 就不能把它赋值给不允许为 null 的变量
经过测试, 把 Text 前面的 const 去掉就不会报错了, 为什么是这样呢?
因为加入 const 了以后, 这个组件就是常量了, 二这个组件中的第一个参数接收 datetime 的时候, 它就不能为 null 了, 但是 datetime 本身有可能为 null, 所以报错。
解决这个报错, 把 datetime 定义成常量值就可以了!
02) Cannot run with sound null safety, because the following dependencies don’t support null safety: - package:intl
什么是 null safety, 字面意思是空安全, 具体没有详细了解, 有兴趣的可以通过下面的地址来了解, 这里特别提醒下, 引入依赖包的时候需要注意是不是 null safety, 否则他就会报这个错误。
A) stackoverflow.com/questions/64917744/cannot-run-with-sound-null-safety-because-dependencies-dont-support-null-safety
B) dart.dev/null-safety/unsound-null-safety
03) A value of type ‘String?’ can’t be assigned to a variable of type ‘String’
原因: 这是因为 dart 语言定义变量时, 如果在数据类型后面加了问好(?), 表示这个变量允许为 null, 如果不加, 就不允许为 null, 对变量进行赋值时, 如果某个变量可以为 null, 但是把它赋值给了不为 null 的变量, 就会发生这个错误。
解决办法: 要么确保两个变量都为 null, 或者都不为 null.
04) Name source files using lowercase_with_underscores
.
原因: dart 语言希望文件名采用小写, 并且使用下横线来分割单词, 为什么是小写? 因为dart语言面向多平台的操作系统, 有些系统大小写敏感, 有些则不是, 这样编译出来的文件, 就会导致引用出现问题, 为了统一, 均采用小写和下横线。
注意: 是文件名采用小写加下横线, 不是类名或者函数名
来源: blog.csdn.net/zhumengzj/article/details/79356040
05) Try using the ‘BigInt’ class if you need an integer larger than 9223372036854775807 or less than -9,223,372,036,854,775,808.
原因: 定义 int 类型的数据, 赋值的最大值是 19 位数, 超过则需要使用其他数据类型来代替。
06) Undefined name ‘$FloorTodoLineDatabase’
说明: 使用 floor ORM 框架的时候, 使用抽象类来声明数据库类, floor 自动根据这个抽象类来生成数据库类的代码, 引用数据库类的时候, 就根据下面的格式来使用书写数据库类:
1 | $Floor + 数据库抽象类名称 |
原因: $FloorTodoLineDatabase 这个写法正确, 但是没有引入 ‘TodoLineDatabase.dart’ , 也就是抽象类的类名, 就会发生这个错误。
07) A value of type ‘TodoLineDatabase’ can’t be returned from an async function with return type Future<Database>
1 | abstract class DatabaseFactory { |
返回值不应该是 Future<Database>, 而应该是 Future<T>, T 是我们自己定义的数据库类名,也就是本文 06) 里面说的数据库抽象类类名, 于是我们把它修改成:
1 | abstract class DatabaseFactory { |
注意: 有时候我们在网上苦苦搜索问题的答案, 一直找不到, 怎么办? 阅读源代码是最好的方式, 本问题是在阅读源代码后才知道使用 Future<T> 而不是 Future<Database>
08) Unhandled Exception: LateInitializationError: Field ‘database’ has not been initialized
dart 中, 使用 late 来修饰的变量, 都是延迟加载, 任何变量, 都需要初始化才可以使用, 延迟加载的变量, 需要在调用变量之前初始化, 不要在准备使用时才开始初始化, 本问题的出现, 是因为 database 是 floor 的数据库类, 初始化是异步初始化, 更需要在使用的前步骤中进行初始化。
09) Functions marked ‘async’ must have a return type assignable to ‘Future’
async 函数返回值应该是 Future<T>, 而不应该是 T
10) Cannot find declaration to go to
说明: android studio 点击类名的时候, 无法查看该类的源代码
原因: 未知
解决办法: 把项目代码从项目空间中移走, 然后在 android studio 中重新创建项目, 名称相同, 再把代码移多来, 问题解决。
android studio 版本: artic fox 2020.3.1 patch 2
winddow 10
11) No pubspec.yaml file found.
原因: flutter run 这个命令应该运行在项目的跟目录下
12) Column type is not supported for dynamic
说明: 运行 flutter packages pub run build_runner build 报错
原因: User 的构造函数 User(this.id, this.name, email); email 所对应的变量也是 email, 其声明为 final, final 变量只能赋值一次, 因此必须在构建类的时候初始化, 但由于没有初始化, 所以报错, 本来想让构造函数中的参数 email 对应类中的变量 email, 但由于少写了 this. 所以, 报错.
解决方法: email 写 this. 最终写法: User(this.id, this.name, this.email);
13) Queries returning streams of single elements might emit null. Make the method return a Stream of a nullable type e.g. Stream<Person?>.
原因: sqlite 的 ORM 框架 floor, dao 类中, 查询语句需要考虑返回值是 null 的情况, Stream<Person?> 允许返回值是 null, Stream<Person> 不允许返回值是 null
解决办法: 使用 Stream<Person?> 来声明返回值
14 [WARNING] source_gen:combining_builder on lib/dao/TodoLineDatabase.dart:
TodoLineDatabase.g.dart must be included as a part directive in the input library with:
TodoLineDatabase.dart 类中必须引入 TodoLineDatabase.g.dart 类, 而且必须是通过 part 来引入
15 Error when reading ‘lib/dao/database.g.dart’: 系统找不到指定的文件。
引入的时候, database.g.dart 这个文件名称不是随便填写的, 这是 floor 生成的文件, floor 会自动根据我们定义的抽象类的文件名称来生成, 抽象类文件的定义类似
1 | 1, entities: [User]) (version: |
根据上面的类名称, floor 生成的 dart 文件应该是 ‘TodoLineDatabase.g.dart’, 所以引入的时候应该根据填写这个文件名称。
如果您觉得这篇文章对您的学习很有帮助, 请您也分享它, 让它能再次帮助到更多的需要学习的人. 您的支持将鼓励我继续创作 !