flutter-开发问题系列之十一   2021-12-11


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

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

1 flutter 单选框如何使用?

1
Radio(value: false, groupValue: 1, fillColor: fillColor, onChanged: (val){})

2 flutter 如何后台运行

  1. BackgroundFetch:
    这是个插件, 该插件帮助我们管理后台任务, 但是很遗憾, 我下载该插件的时候报错, 代码仓库中没有对应的插件
    pub.dev/packages/background_fetch

  2. Isolate:
    相当于一个线程, 他允许你在后台运行, 特别是计算周期比较长的任务, 适合使用 Isolate, 这是 Dart 语言提供的。
    psvmc.cn/article/2020-08-08-flutter-isolate.html

3 flutter 开发, 如何让 android app 自启动

我从网上找到的方法, 其实是 android 开发使用 java 的方法来实现该功能, dart 语言的方法我还没有实现过。
大概的步骤如下:

  1. 添加权限
  2. AndroidManifest.xml 配置 receiver, 以便于监听系统广播, 捕获启动广播
  3. 写一个 java class 类, 用来拦截系统的广播, 如果是启动系统的广播, 就启动App。

来源: blog.csdn.net/suyie007/article/details/90599866
注意: 如果没有效果, 不妨先 flutter clean 一下

4 弹出遮罩效果的窗口中, 操作后元素没有跟着改变

原因: 这个窗口使用到 showModalBottomSheet, 一般来讲 showModalBottomSheet 无法直接使用有状态组件(statefull), 要使用有状态组件(statefull), 使页面布局动态变化, 就需要使用到 StatefulBuilder, StatefulBuilder 会提供 setState 方法来动态更新组件, 使用动态布局, showModalBottomSheet

注意: StatefulBuilder 提供的 setState 参数, 应该修改一下名称, 让他跟主页面不同, 要不然, 主页面中的 setState 和 遮罩效果窗口中的 setState 名称一样, 就会发生混淆, 导致报错。

5 flutter 如何使用第三方图标

具体步骤如下:

  1. 把第三方图标下载下来
  2. pubspec.yaml 中配置第三方图标
  3. 代码中引用第三方图标
    来源: blog.csdn.net/shuaizi96/article/details/88550217

6 flutter 如何弹出状态栏通知?

请使用插件: /flutter_local_notifications
请参考: blog.csdn.net/weixin_44350337/article/details/112717346

7 如何在弹出的窗口中动态改变布局元素? 也就是如何根据不同的情况显示不同的元素?

使用 StatefulBuilder 即可。
来源: newbedev.com/dart-how-to-setstate-in-alertdialog-flutter-code-example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static void popupCustomWindow(BuildContext context, List<Widget> list) {
showDialog(
context: context,
builder: (context) {
return AppCustomDialog(
Container(
height: list.length * 51,
width: MediaQuery.of(context).size.width - 10,
color: Colors.white,
child: Column(
mainAxisSize: MainAxisSize.min,
children: list
),
)
);
}
);
}

改成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void popupCustomWindow(BuildContext context, List<Widget> list) {
showDialog(
context: context,
builder: (context) {
return StatefulBuilder(
builder: (context, setState) {
return AppCustomDialog(
Container(
height: list.length * 51,
width: MediaQuery.of(context).size.width - 10,
color: Colors.white,
child: Column(
mainAxisSize: MainAxisSize.min,
children: list
),
)
);
},
);
}
);
}

注意: 中间多套了一个 StatefulBuilder
最后我们可以这样调用:

1
2
3
4
5
6
7
8
9
10
_popupActionMenu(context, App.configs.inboxViewConfigs, (checked) {
int? id = App.configs.inboxViewConfigs[InboxViewConfigTag.showFinished.name]?.id;
String tag = InboxViewConfigTag.inboxView.name;
String key = InboxViewConfigTag.showFinished.name;
String val = (checked == true ? "1" : "0");
_configService.persist(id, tag, key, val, "").then((value) {
Navigator.of(context).pop();
App.configs.loadConfigs();
});
});

存在的问题:
需要使用关闭 Dialog 后再打开, 这样才会刷新, Navigator.of(context).pop(); 就是干这个用的。 这可能的原因是 AppCustomDialog 不是 StateFullWidget

来源:
newbedev.com/dart-how-to-setstate-in-alertdialog-flutter-code-example

8 flutter floor 如何使用数据库视图

请使用注解 @DatabaseView, 记得在 database 抽象类中添加 view 对象.

  1. 使用 DatabaseView 映射实体类和数据库视图

    1
    2
    3
    4
    5
    6
    7
    8
    @DatabaseView('''
    select id, type from tsk union all
    select id, type from rot union all
    select id, type from hab
    ''', viewName: "td")
    class Todo extends En.Entity {
    // class members
    }
  2. database 抽象类中指明 view

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

注意: DatabaseView 注解中写的 sql 语句, 字段名应该和实体类成员变量的名称一致, 不是跟 @ColumnInfo 中的配置名称一致


分享到:


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

Contents

  1. 1 flutter 单选框如何使用?
  2. 2 flutter 如何后台运行
  3. 3 flutter 开发, 如何让 android app 自启动
  4. 4 弹出遮罩效果的窗口中, 操作后元素没有跟着改变
  5. 5 flutter 如何使用第三方图标
  6. 6 flutter 如何弹出状态栏通知?
  7. 7 如何在弹出的窗口中动态改变布局元素? 也就是如何根据不同的情况显示不同的元素?
  8. 8 flutter floor 如何使用数据库视图