flutter-开发问题系列之六   2021-11-13


这是 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
2
3
4
5
6
7
8
Set<String> keys = <String>{};
...
...
...
for(int i=0;i<keys.length;i++) {
List<Todo> gList = [];
String key = keys[i];
}

报错代码 keys[i], 不知道为何报错, 改成下面的代码就OK:

1
2
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
2
Color priorityColor = priorityColorList[priority];
Icon(Icons.flag_outlined, color: priorityColor)
注意:

把 priorityColorList[priority] 单独定义成一个变量就可以了, 按理来讲不需要单独定义变量也应该可以。

4 Avoid using braces in interpolation when not needed

1
2
3
4
5
// 需要改进的代码:
Message.toast(context, "${todoTypeLabel} has finished");

// 正确的代码:
Message.toast(context, "$todoTypeLabel has finished"); // 注意: 缺少大括号

这有什么区别吗?
$ 后面可以直接跟着变量, 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@entity
class Todo {
@primaryKey
int? id;

int? type;

int? userid;

String? title;

Todo(int? id, int? type, int userid, String? title) {
this.id = id;
this.type = type;
this.userid = userid;
this.title = title;
}

factory Todo.from(User user, TodoItemType type, String title) {
int _id = generateTodoId(user);
int _duration = duration.toMinute();
return Todo(_id, type.index, user.id!, title);
}

Todo.invalid(User user, TodoItemType type, String title) {
int _id = generateTodoId(user);
int _duration = duration.toMinute();
Todo(_id, type.index, user.id!, title);
}

}

上面有 3 个构造函数, Todo, Todo.from, Todo.invalid, 如果我们定义变量:

1
2
Todo todo1 = Todo.invalid(user, type, "title");
Todo todo2 = Todo.from(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
2
final  List<Color> _todoTypeColorList = [AppColor.taskColor, AppColor.routineColor, AppColor.habitColor];
Color _todoTypeColor = _todoTypeColorList[0];

报错是在 _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
2
3
routes: (
"/home": (context) => UserRegister(title:""),
)

将上面的代码改成下面的代码后OK,

1
2
3
routes: {
"/home": (context) => UserRegister(title:""),
}
注意:

是把小括号改成大括号。

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


分享到:


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

Contents

  1. 1 Cannot hit test a render box with no size.
  2. 2 The operator ‘[]’ isn’t defined for the type ‘Set<String>’.
  3. 3 flutter Closure call with mismatched arguments: function ‘index’
    1. 注意:
  • 4 Avoid using braces in interpolation when not needed
  • 5 no such column: false ……
  • 6 type ‘Null’ is not a subtype of type ‘int’ in type cast(floor)
  • 7 The instance member ‘_todoTypeColorList’ can’t be accessed in an initializer
  • 8 type ‘Null’ is not a subtype of type ‘User’ in type cast
  • 9 The argument type ‘String’ can’t be assigned to the parameter type ‘Map<String, Widget Function(BuildContext)>’
    1. 注意:
  • 10 The argument type ‘void Function(int)’ can’t be assigned to the parameter type ‘void Function(int?)?’.
    1. 注意:
    2. 参考: