这是 todoline++ 项目开发过程中遇到的问题系列, 记录下来供大家参考。
本篇记录一些报错
todoline++ 官网请看这里: https://todoline-plus-plus.github.io/
1 Cannot hit test a render box with no size.
由于代码是通过赋值粘贴然后在修改, 造成了这个错误, 通过对比代码的异同, 发现是:
Container 下面包含 Row, 我把 Row 换成 Column 就好。
2 The operator ‘[]’ isn’t defined for the type ‘Set<String>’.
1 | Set<String> keys = <String>{}; |
报错代码 keys[i], 不知道为何报错, 改成下面的代码就OK:
1 | for (String key in keys) { |
附: 为何报错?
我们可以使用 [] 来初始化一个 List 变量, 但是对于 Set 我们不能使用 [], 只能使用 {}, 这意外着, 使用 [] 来初始化, 其结果是数组, 使用 {} 来初始化, 其结果是 map, 进一步查询源码, Set 是委托 LinkedHashSet 来实现, 见名思意, 底层是链表, 这是我脑补的结果, 源代码实在是看不懂。
注意:
网上很多资料说, Set 可以使用下面的方法来定义, 但经过我的测试, 不行:
1 | Set<String> keys = []; |
猜测可能是因为版本不同引起。
参考:
juejin.cn/post/6844903984218505230
3 flutter Closure call with mismatched arguments: function ‘index’
错误代码如下:
1 | Icon(Icons.flag_outlined, color: priorityColorList[priority]) |
正确的代码如下:
1 | Color priorityColor = priorityColorList[priority]; |
注意:
把 priorityColorList[priority] 单独定义成一个变量就可以了, 按理来讲不需要单独定义变量也应该可以。
4 Avoid using braces in interpolation when not needed
1 | // 需要改进的代码: |
这有什么区别吗?
$ 后面可以直接跟着变量, dart 会自动识别这个变量值。
${} 括号里面是一个表达式, 可以是变量, 也可以是方法, 甚至进行代码运算。
通常情况下, 如果我们只使用${param}把变量值显示出来, IDE 工具会作出这个提示, 换句话说, IDE 倾向于让我使用 $param 把变量值显示出来。
5 no such column: false ……
1 | SELECT * FROM Todo where deleted = false |
我通过查询 sqlite 的资料, 网上有文章说, sqlite 的基本数据类型中没有布尔类型, 但他也会直接支持 true 和 false, 于是在进行 select 查询的时候, 就直接使用这两个常量值了, 结果报这个错误.
那怎么解决呢?
把 false 改成 0, true 改成 1 即可。
6 type ‘Null’ is not a subtype of type ‘int’ in type cast(floor)
这是因为实体类的 id 为 null 引起, 那为什么实体类的 id 为 null 呢?
看下下面实体类的构造函数:
1 |
|
上面有 3 个构造函数, Todo, Todo.from, Todo.invalid, 如果我们定义变量:
1 | Todo todo1 = Todo.invalid(user, type, "title"); |
todo1 的 id 将会是 null, todo2 的 id 不会是 null, 有什么区别吗?
构造函数 Todo.invalid 缺少返回值和 factory 关键字
7 The instance member ‘_todoTypeColorList’ can’t be accessed in an initializer
1 | final List<Color> _todoTypeColorList = [AppColor.taskColor, AppColor.routineColor, AppColor.habitColor]; |
报错是在 _todoTypeColorList[0] 这个语句, 个人的理解, 成员变量 _todoTypeColorList 还未初始化, 解决办法有:
1) 把常量值赋值给 _todoTypeColor。
2) 使用 static 来修饰 _todoTypeColorList 变量。
8 type ‘Null’ is not a subtype of type ‘User’ in type cast
在两个页面间进行路由跳转, 有时候我们需要传递参数, 在接收传递的参数时进行强制类型转换, 如果参数值为 null, 就会报这个错误, 这个时候需要注意, 使用as 进行性类型转换的时候, 要确保值不能为 null, 下面是报错的语句:
1 | _operator = ModalRoute.of(context)?.settings.arguments as User; |
9 The argument type ‘String’ can’t be assigned to the parameter type ‘Map<String, Widget Function(BuildContext)>’
1 | routes: ( |
将上面的代码改成下面的代码后OK,
1 | routes: { |
注意:
是把小括号改成大括号。
10 The argument type ‘void Function(int)’ can’t be assigned to the parameter type ‘void Function(int?)?’.
报错的代码如下:
1 | onChanged: (int index) {} |
修改后正常, 正常代码如下:
1 | onChanged: (int? index) {} |
注意:
int 后面多了一个问号!
参考:
stackoverflow.com/questions/68393585/how-to-fix-error-the-argument-type-void-functionstring-int-cant-be-assign
如果您觉得这篇文章对您的学习很有帮助, 请您也分享它, 让它能再次帮助到更多的需要学习的人. 您的支持将鼓励我继续创作 !