flutter-开发问题系列之十二   2021-12-25


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

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

1 flutter Text 组件, 设置 overflow 不起作用

之前 Text 组件的文字太长, 希望截断并使用… 来表示, 之前的方法如下:

1
2
A) Text 外面套一个 Expanded 组件
B) 设置 overflow = TextOverflow.ellipsis

但是今天设置发现, 不起作用, 把之前设置成功的代码拷贝过来, 依然不起作用。
只好写代码手工截断。

2 flutter 项目更改图标后, 看起来非常的小

查看网上的资料, 通过 android 项目的办法来解决, 也就是把 flutter 项目目录下的 android 目录当作 android 项目来对待, 然后使用 android studio 来打开该项目, 然后在修改图标文件。

在 flutter 中把 android 目录当作 android 工程来打开的办法如下:

1
android studio ==> projectName ==> android ==> right click ==> flutter ==> open android module in android studio 

来源:
stackoverflow.com/questions/58051362/flutter-android-launcher-icon-looks-very-small

3 flutter 如何打包?

使用 cmd 命令:

  1. 一键打包: flutter build apk
  2. 分架构打包: flutter build apk –target-platform android-arm,android-arm64,android-x64 –split-per-abi

来源: blog.csdn.net/campchan/article/details/118912540

4 flutter Column 组件, 如果项目太多, 超出屏幕高度所能够显示的高度, 就会报错, 怎么办?

之前看到 Column, 认为它和 ListView 是一样的, 今天终于看到了他们的区别。

5 flutter 项目, 如何修改程序图标?

全部是按照原生项目的办法来解决, flutter 项目下有 android, ios, windows 等这些目录, 这些目录对应着各自的原生项目, 我们完全可以把它当作一个原生项目来对待就可以, 下面是各自对应的文件目录:
android: project-name\android\app\src\main\res
IOS: 没开发过IOS, 不知道。
window: projectName\windows\runner\app_icon.ico

6 flutter 中有一个专门处理日期的类:DateUtils

这是查看源代码的时候发现的, 平时处理日期的时候就不用自己再动手写了!

7 flutter floor 框架的 @Query 注解中, select count 语句总是返回 null 值, 得不到统计数值

查看代码发现, floor 生成的代码中, 使用的是 _queryAdapter.queryNoReturn() 方法, 执行该方法后不会返回查询到的数据, 因此为 null。

那怎么办呢?

通过测试发现, dao 类中如果返回的数据类型是 @entity 标记的类, 他就会返回数据, 否则生成的代码中就会调用 _queryAdapter.queryNoReturn(), 这个不会返回任何数据.

解决办法:
我提交了一个问题给开发者, 目前暂时的解决办法是:

  1. 新建一个实体类, 然后在查询
  2. 查询出所有的数据, 然后再用代码统计

8 easyIsolate 使用心得

初始化时 worker 需要发送消息才会在 IsolateHandler 中运行
pub.dev/packages/easy_isolate

9 Flutter 插件实现 JavaScript 和 Dart 交互数据

该功能还没有实现过, 下面的地址仅供参考:
zhuanlan.zhihu.com/p/372006972

10 据说 RxDart 是一个非常牛逼的框架, 用来处理异步非常方便, 具体请参考:

blog.csdn.net/hjjdehao/article/details/104280422

11 路由设置中 initialRoute 和 home 的区别是?

12 flutter 中的 build 方法和 initState 不能添加 async 关键字

想在系统中初始化数据库对象, 有两个独立的线程需要使用数据库对象:

  1. 程序主线程,
  2. 后台运行通知的副线程

本来想在某个开始位置初始化数据库对象, 然后在启动第二个线程, 发现 main 入口中无法初始化, 这个时候 floor 基础类还没有初始化, 所以只能在 build 或者 initState 方法中初始化数据库对象, 但是我们需要等到数据库对象初始化完成后才能进行下一步, 所以需要 async, 但是发现这两个方法不能使用 async, 如果只有一个线程那好办, 抽出来在一个方法里面数据初始化就可以了, 但是有两个线程, 这个时候就难办了, 真不知道该如何是好!

最后解决方案: 初始化数据库对象独立抽出来变成一个方法, 该方法需要:
A) 可以多线程异步调用
B) 只能运行一次, 第二次必须退出, 这样可以确保数据库对象只初始化一次
C) 使用锁确保只有一个线程进入

13 Widget 如何继承?

被继承页面的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class BaseView<T> extends StatefulWidget {
const BaseView({Key? key, required this.title}) : super(key: key);
final String title;

@override
State<BaseView> createState() => BaseViewState<BaseView>();
}

class BaseViewState<T extends BaseView> extends State<T> {
@override
Widget build(BuildContext context) {
return xxx;
}
}

继承页面的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Inbox extends BaseView {
const Inbox({Key? key, required this.title}) : super(key: key, title: title);

final String title;

@override
_InboxPageState createState() => _InboxPageState();
}

class _InboxPageState extends BaseViewState<Inbox> {
@override
Widget build(BuildContext context) {
return super.build(context);
}
}

参考来源:
stackoverflow.com/questions/67145831/error-type-argument-t-doesnt-conform-to-the-bound-object-of-the-type-varia

14 flutter 如何判断操作系统平台?

1
2
3
4
5
import 'dart:io'

if (Platform.isAndroid) {
//
}

15 如何查看 Dart 和 Flutter安装路径

1
2
where flutter dart
which flutter dart

参考来源: blog.csdn.net/ezconn/article/details/114480894

16 flutter pub get 后下载的插件放在哪里?

1
C:\Users\xxx\AppData\Local\Pub\Cache\hosted\pub.flutter-io.cn\xxx

怎么找到?
flutter 项目的根目录下面有一个文件: .flutter-plugins, 里面指明了每个安装插件的所在路径。

17 flutter 应用如何进行混淆?

还没有操作, 请参考:
jianshu.com/p/4dd5e5977f36

18 flutter 应用开机启动不让弹出页面怎么处理?

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
@override
Widget build(BuildContext context) {
String firstPage = "/Home";
return WillPopScope(
onWillPop: () async {
if (Navigator.canPop(context)) {
return true;
} else {
// TODO: run in background
return false;
}
},
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: 'TodoLine++',
theme: ThemeData(
primarySwatch: AppColor.primaryColor,
),
routes: {
"/Home": (context) => const Home(title:""),
"/SignUp": (context) => const SignUp(title:""),
"/Inbox": (context) => const Inbox(title: 'Inbox'),
"/Todo": (context) => const Todo(title: 'Todo Item'),
TodayViewMode.list.route: (context) => const TodayListView(title: 'Today'),
TodayViewMode.focus.route: (context) => const TodayFocusView(title: 'Tomato Clock'),
"/TomatoSetting": (context) => const TodayTomatoSettingView(title: 'Tomato Setting'),
"/Breath": (context) => const Breath(title: 'Breath'),
"/Mood": (context) => const Mood(title: 'Mood'),
"/MoodAddView": (context) => const MoodNewView(title: 'Mood New'),
},
initialRoute: firstPage,
home: const Home(title:""),
),
);
}

注意:
关键的代码是 onWillPop 里面的判断
平时我们在 main 函数的 build 方法里面, 直接返回 MaterialApp, 但为了使用 onWillPop, 我们不得不使用 WillPopScope


分享到:


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

Contents

  1. 1 flutter Text 组件, 设置 overflow 不起作用
  2. 2 flutter 项目更改图标后, 看起来非常的小
  3. 3 flutter 如何打包?
  4. 4 flutter Column 组件, 如果项目太多, 超出屏幕高度所能够显示的高度, 就会报错, 怎么办?
  5. 5 flutter 项目, 如何修改程序图标?
  6. 6 flutter 中有一个专门处理日期的类:DateUtils
  7. 7 flutter floor 框架的 @Query 注解中, select count 语句总是返回 null 值, 得不到统计数值
  8. 8 easyIsolate 使用心得
  9. 9 Flutter 插件实现 JavaScript 和 Dart 交互数据
  10. 10 据说 RxDart 是一个非常牛逼的框架, 用来处理异步非常方便, 具体请参考:
  11. 11 路由设置中 initialRoute 和 home 的区别是?
  12. 12 flutter 中的 build 方法和 initState 不能添加 async 关键字
  13. 13 Widget 如何继承?
  14. 14 flutter 如何判断操作系统平台?
  15. 15 如何查看 Dart 和 Flutter安装路径
  16. 16 flutter pub get 后下载的插件放在哪里?
  17. 17 flutter 应用如何进行混淆?
  18. 18 flutter 应用开机启动不让弹出页面怎么处理?