flutter-开发问题系列之三   2021-10-23


这是 todoline++ 项目开发过程中遇到的问题系列, 记录下来供大家参考。
本篇记录一些异常!

01) A value of type ‘Null’ can’t be assigned to a parameter of type ‘String’ in a const constructor.

1
2
3
4
5
6
7
8
9
10
Container(
alignment: const Alignment(0, 0),
child: TextButton(
child: const Text(
datetime,
style: TextStyle(fontSize: 12)
),
onPressed: onChangeDateTime
)
)

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
2
3
4
5
6
abstract class DatabaseFactory {
static Future<Database> generateDatabase() async {
final _database = await $FloorTodoLineDatabase.databaseBuilder('todo_line_plus.db').build();
return _database;
}
}

返回值不应该是 Future<Database>, 而应该是 Future<T>, T 是我们自己定义的数据库类名,也就是本文 06) 里面说的数据库抽象类类名, 于是我们把它修改成:

1
2
3
4
5
6
abstract class DatabaseFactory {
static Future<TodoLineDatabase> generateDatabase() async {
final _database = await $FloorTodoLineDatabase.databaseBuilder('todo_line_plus.db').build();
return _database;
}
}

注意: 有时候我们在网上苦苦搜索问题的答案, 一直找不到, 怎么办? 阅读源代码是最好的方式, 本问题是在阅读源代码后才知道使用 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
2
3
4
@Database(version: 1, entities: [User])
abstract class TodoLineDatabase extends FloorDatabase {
UserDao get userDao;
}

根据上面的类名称, floor 生成的 dart 文件应该是 ‘TodoLineDatabase.g.dart’, 所以引入的时候应该根据填写这个文件名称。


分享到:


  如果您觉得这篇文章对您的学习很有帮助, 请您也分享它, 让它能再次帮助到更多的需要学习的人. 您的支持将鼓励我继续创作 !
本文基于署名4.0国际许可协议发布,转载请保留本文署名和文章链接。 如您有任何授权方面的协商,请邮件联系我。

Contents

  1. 01) A value of type ‘Null’ can’t be assigned to a parameter of type ‘String’ in a const constructor.
  2. 02) Cannot run with sound null safety, because the following dependencies don’t support null safety: - package:intl
  3. 03) A value of type ‘String?’ can’t be assigned to a variable of type ‘String’
  4. 04) Name source files using lowercase_with_underscores.
  5. 05) Try using the ‘BigInt’ class if you need an integer larger than 9223372036854775807 or less than -9,223,372,036,854,775,808.
  6. 06) Undefined name ‘$FloorTodoLineDatabase’
  7. 07) A value of type ‘TodoLineDatabase’ can’t be returned from an async function with return type Future<Database>
  8. 08) Unhandled Exception: LateInitializationError: Field ‘database’ has not been initialized
  9. 09) Functions marked ‘async’ must have a return type assignable to ‘Future’
  10. 10) Cannot find declaration to go to
  11. 11) No pubspec.yaml file found.
  12. 12) Column type is not supported for dynamic
  13. 13) Queries returning streams of single elements might emit null. Make the method return a Stream of a nullable type e.g. Stream<Person?>.
  14. 14 [WARNING] source_gen:combining_builder on lib/dao/TodoLineDatabase.dart:
  15. 15 Error when reading ‘lib/dao/database.g.dart’: 系统找不到指定的文件。