Android

在 Android 项目中调用 Flutter,flutter将作为一个Module被元工程引用,为了方便管理,我将flutter项目的工程和Android工程放在同一层级
创建flutter module

1
flutter create -t module flutter_demo

在 Android 工程项目中的settings.gradle中添加

1
2
3
4
setBinding(new Binding([gradle: this]))
evaluate(new File(
settingsDir,
'../flutter_demo/.android/include_flutter.groovy'))

在需要引用的 App Module 添加依赖

1
2
3
dependencies {
implementation project(':flutter')
}

注意:需要将 App 的 sdk:minSdkVersion 和 flutter 的设置一致,同时需要 flutter android 工程中可能还在引用 support 的包,可以升级为 androidx.appcompat

示例

避免接受到不相关的LiveData回调
首先我们要知道Room的实现机制

  1. 使用triggers监听到了表的增删改查
  2. Room创建了一个InvalidationTracker观察表是否发生改变
  3. InvalidationTracker.Observer#onInvalidated调用,通知Observer重新查询

Room只知道你的表发送了变化,但是不知道具体发生了什么变化,而且并不知道这些变化观察者是否关心。Room本身并不保存数据所以它也无法判断,观察者要的数据要否变化。

所以在实际使用中你需要自己过滤掉不需要的通知

1
2
3
4
5
6
7
@Dao
abstrat class UserDao : BaseDao<User>() {
@Query("SELECT * FROM Users WHERE userid = :id")
protected abstract fun getUserById(id : String) : Flowable<User>

fun getDistinctUserBy
}

从quickstart开始

1
2
3
4
git clone https://github.com/electron/electron-quick-start
cd electron-quick-start
npm install
npm start

可以看到一个简单的electron桌面程序启动了

Electron中分为两类进程,一类是主进程main,另一类是渲染器进程renderer
主进程只有一个,负责对整个应用的管理,包括后台操作,创建GUI,处理GUI和后台交互操作
主进程无法显示窗口,在主进程中调用BrowserWindow模块才能使用不同的窗口,每个窗口调用格子的渲染器进程来讲页面渲染到窗口中
由于在网页里管理原生GUI资源是非常危险而且容易造成资源泄露,所以在网页调用GUI相关API是不允许的,如果要在网页中使用GUI操作,其相对应的渲染进程必须和主进程进行通讯,请求主进程进行相关GUI操作

工程目录

工程目录如下

1
2
3
4
- index.html
- main.js
- renderer.js
- package.json

package.json声明了启动脚本,和进程的入口

1
2
3
4
5
6
7
8
{
// ...
"main": "main.js",
"scripts": {
"start": "electron ."
},
// ...
}

如果没有声明main,Electron会优先加载index.js

main.js创建窗口和处理系统时间

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
// APP生命周期模块 原生浏览器窗口模块
const {app, BrowserWindow} = require('electron')
// 保持一个全局的window引用,当JS被GC window不会自动关闭
let mainWindow
// 创建窗口
function createWindow () {
// 创建浏览器窗口
mainWindow = new BrowserWindow({width: 800, height: 600})
// 加载应用的index.html
mainWindow.loadFile('index.html')
// 打开开发工具
// mainWindow.openDevTools()
mainWindow.on('closed', function () {
// window关闭时取消引用
mainWindow = null
})
}
// Electron完成初始化准备创建窗口时调用
app.on('ready', createWindow)

// 当窗口被关闭,退出
app.on('window-all-closed', function () {
// 判断OS X上,关闭时退出程序
if (process.platform !== 'darwin') {
app.quit()
}
})

app.on('activate', function () {
if (mainWindow === null) {
createWindow()
}
})