flutter-开发问题系列之四   2021-10-30


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

todoline++ 官网请看这里: https://todoline-plus-plus.github.io/

1 Column type is not supported for Todo

1
2
3
4
5
6
7
8
@dao
abstract class TodoDao {
@insert
Future<void> insertTodo(Todo todo);

@Query("update Toto set type = :todo.type, title = :todo.title, desc = :todo.desc, edit_time = strftime('%s','now','localtime'), tag = :todo.tag, state = :todo.state, anticipate_time = :todo.anticipateTime, cost_time = :todo.costTime, datetime = :todo.datetime, priority = :todo.priority, parent = :todo.parent, sub_amount = :todo.subAmount, remind_time = :todo.remindTime where id = :todo.id")
Future<void> updateTodo(Todo todo);
}

上面的代码中, type = :todo.type, 这种写法不支持, todo 表示一个对象, 目前 floor 的 sql 语句中, 不支持通过对象的属性来获取值, 只能改用下面的代码来完成:

1
2
@update
Future<void> updateTodo(Todo todo);

参考: github.com/vitusortner/floor/issues/221

2 Context: ‘TodoLineDatabase.todoDao’ is defined here.

1
2
3
4
5
@Database(version: 1, entities: [User, Todo])
abstract class TodoLineDatabase extends FloorDatabase {
UserDao get userDao;
TodoDao get todoDao;
}

floor 构建代码的时候, 没有生成 TodoDao get todoDao 的对应方法, 这应该是 bug 吧?
是因为在 TodoLineDatabase 这个抽象类中, 下面这条语句写错了

1
part 'TodoLineDatabase.g.dart';

应该写成:

1
part 'todoline_database.g.dart';

在重新运行下面的代码就 OK 了:

1
flutter packages pub run build_runner build

3 A RenderFlex overflowed by 93 pixels on the bottom

通过的问题是, 一个组件里面嵌套另外一个子组件, 两个组件都有相同的特征: 没有确定的高度, 导致 flutter 无法确定页面渲染的高度, 也就是说这两个组件是动态决定的。

我自己的情况是: Container 内嵌套这另外一个 Container, 去掉一个 Container 就可以了, 如果你碰到相同的情况, 把其中一个组件换成可以确定高度的组件就可以了。

参考: blog.csdn.net/yuzhiqiang_1993/article/details/89451080

4 TextField widgets require a Material widget ancestor.

TextField 需要用 Scaffold 进行包裹, 但是使用 Scaffold 包括后, 又变成新的页面, 我需要有弹窗效果, 也就是有遮罩效果的窗口, 怎么办?
疯狂搜索后, 仔细阅读错误日志才发现

1
2
3
4
5
6
7
8
9
10
11
To introduce a Material widget, you can either directly include one, or use a widget that contains
Material itself, such as a Card, Dialog, Drawer, or Scaffold.
The specific widget that could not find a Material ancestor was:
TextField
The ancestors of this widget were:
...
Column
ColoredBox
Container
DefaultTextStyle
Padding

原来我可以使用 Card, Dialog, Drawer, 或者 Scaffold, 于是我换成了 dialog, 但还是不行, 最终还是不行.

继续搜索, 又换成 Overlay, 参考: juejin.cn/post/6844904115764658189,
但是 Overlay 无法形成阴影的遮罩效果, 为什么呢? 因为 Overlay 相当于打开新的页面。

怎么办?

使用自定义 Dialog。
flutter 如何自定义 Dialog?
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
32
33
34
35
36
class CustomDurationDialog extends Dialog {
final OnDurationSelected selected;

CustomDurationDialog(this.selected);

@override
Widget build(BuildContext context) {
TextEditingController emailController = new TextEditingController();

return Material(
type: MaterialType.transparency,
child: Center(
child: Container(
height: 200,
width: MediaQuery.of(context).size.width - 10,
color: Colors.white,
child: Column(
children: [
Container(
width: MediaQuery.of(context).size.width - 20,
height: 50.0,
margin: const EdgeInsets.only(top: 20.0),
child: ElevatedButton(
child: const Text("OK"),
onPressed: () async {
String email = emailController.text;
},
),
)
]
),
),
),
);
}
}

来源: jianshu.com/p/6e0994952ae4

5 flutter Invalid constant value.

一般是变量前面多加了 const 关键字, 去掉即可


分享到:


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

Contents

  1. 1 Column type is not supported for Todo
  2. 2 Context: ‘TodoLineDatabase.todoDao’ is defined here.
  3. 3 A RenderFlex overflowed by 93 pixels on the bottom
  4. 4 TextField widgets require a Material widget ancestor.
    1. 使用自定义 Dialog。
    2. flutter 如何自定义 Dialog?
  • 5 flutter Invalid constant value.