这是 todoline++ 项目开发过程中遇到的问题系列, 记录下来供大家参考。
本篇记录一些开发中遇到的报错:
todoline++ 官网请看这里: https://todoline-plus-plus.github.io/
1 Failed assertion line 201 pos 12 debugDuringDeviceUpdate is not true. Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
下面是个人的理解, 感觉不太正确, 但按照该方法已经解决问题。
这是高度无法确定引起, 根据我自身的经验, 一般是 Column 或者 Row 下面嵌套着 Column 或者 Row 引起, 经过详细的检查, 的确如此, 请看下面的嵌套结构
1 | column: |
问题出现在 column(ListItem) 下面嵌套着 ListView, 你可能会说, column 不是先嵌套一个 Expaned 然后才是 ListView 吗? 是的, 的确如此, 但是 Expaned 无法确定高度, 只能依赖于 ListView 来确定, 但是 ListView 本身无法确定高度, 因为他的子元素有多少并知道。 最后我的解决办法是 使用 ListTile 来代替 column, 最后解决了问题
2 RenderFlex children have non-zero flex but incoming height constraints are unbounded.
我已经记不了这个问题是怎么解决的了, 但感觉跟上面的问题 1 有关系, 请参考下面的解答:
1 | 1) blog.csdn.net/kaixuan_dashen/article/details/102308861 |
3 You are trying to change an object which is not an entity.
使用 floor 框架的时候, 我们需要定义一个类, 这个类使用注解 @Database 来定义数据库类, 在这个注解里面, 我们使用 entities 来指明数据表对应的实体类有哪些, 如果我们忘记添加实体类, 就会报这个错误, 其他情况会不会也触发这个错误, 目前尚不清楚.
1 | 1, entities: [User]) (version: |
4 Building with plugins requires symlink support.
安装一些插件需要特殊的权限, 这些插件没有权限, 所以报错。
我是在运行 windows 应用时报此错误, 通过dos命令 start ms-settings:developers 弹出设置窗口, 开启开发人员模式即可
参考: stackoverflow.com/questions/68089177/flutter-building-with-plugins-requires-symlink-support
5 Unhandled Exception: Unable to load asset: assets/
有两个条件:
A) assets 文件夹下面没有该文件。
B) pubspec.yaml 没有声明该文件。
C) 代码中引用文件名时给出的路径不正确。
以上 3 个条件都要同时具备才能够找到所需的资源文件
6 The value of the ‘asset’ field is expected to be a list of relative file paths
这是在 pubspec.yaml 文件中声明资源文件时报错
请注意 yaml 文件的写法, list 的 item 项目前面需要使用 - 来标识, 例如:
1 | files: |
如果 item 只有一个, 那么他就不是 list, 也就是说, 下面的格式是错误的, 因为 audios 的元素只有一个。
1 | audios: |
7 Unhandled Exception: MissingPluginException(No implementation found for method setReleaseMode on channel xyz.luan/audioplayers)
有些插件还不支持 windows, 我使用 audioplayers 时报这个错误!
8 database is locked, database is locked
下面是我从网上找到的说明和解决方法:
原因: sqlite数据库,同一时刻允许多个进程/线程读,但同一时刻只允许一个线程写
解决办法: 对所有数据库操作的方法添加 synchronized 关键字
问题: 不清楚该方法是否能够解决这个问题
自己找到的
原因: flutter 中对 sqlite 的查询, 返回对象都是 Future, 通过对 Future 对象的检测, 发现 flutter 实时对数据库进行监控, 一有更新就重新查询, 这很可能是采用数据驱动的结果, 如果我们的页面中只有一个 DAO 函数对数据库进行查询,一般不会出现什么问题, 但如果是多个 DAO 函数对数据库进行查询, 由于实时对数据库进行监控, 会有多个线程对数据库进行操作, 就会触发这个错误, 而且容易导致页面崩溃, 这就是我找到的原因。
解决办法: 请确保一个页面只有一个线程对数据库进行操作, 如果需要查询多个数据, 最好的办法就是先把所有数据查询出来, 再在内存中分组分类, 我自己就是采用该办法, 实在不行, 那就采用数据库视图吧, 不过这只是我的想法, 还没有测试过。
9 setState() is being called because another object is retaining a reference to this State object after it has been removed from the tree
这是因为异步函数还没有返回, 页面已经关闭, 就报这个错误, 解决办法:
1 | _configService.listTomatoConfigs().then((value) { |
使用 mounted 来判断页面是否存在。
10 Make sure you always use the transaction object for database operations during a transaction
发现, 下列情况下就会发出这个警告:
由于 floor 采用数据驱动, 查询时返回 Future 对象, 这种查询数据方式会实时从数据库检查变更的数据, 就好比是有一个监听器在监听数据库的变化, 并更新到内存中, 如果同时查询两组数据, 相当于有两个监听器在实时监听数据库中的变化, 这就导致了报警, 这是个人猜测的结果, 不是分析源码后得出的结论, 但如果同一时间只有一组数据需要实时刷新, 就不会报警。
11 flutter Instance members can’t be accessed from a factory constructor
stackoverflow.com/questions/64663090/instance-members-cant-be-accessed-from-a-factory-constructor-how-can-i-fix-thi
12 Annotation must be either a const variable reference or const constructor invocation
1 |
|
改成
1 |
|
注意: 两个函数名称不同, 为什么会这样我就不明白
如果您觉得这篇文章对您的学习很有帮助, 请您也分享它, 让它能再次帮助到更多的需要学习的人. 您的支持将鼓励我继续创作 !