同步ios的功能
17
README.md
@@ -44,3 +44,20 @@ iOS端暂无上架打算,用户自行下载main分支源码编译安装
|
|||||||
### 不支持的功能
|
### 不支持的功能
|
||||||
>* 应用设置
|
>* 应用设置
|
||||||
>* 通知设置
|
>* 通知设置
|
||||||
|
|
||||||
|
|
||||||
|
版本更新通知 https://t.me/qinglongapp
|
||||||
|
|
||||||
|
用于生成app的图标
|
||||||
|
|
||||||
|
flutter pub run flutter_launcher_icons:main
|
||||||
|
生成原生的启动页面
|
||||||
|
|
||||||
|
flutter pub run flutter_native_splash:create
|
||||||
|
修改app名称
|
||||||
|
|
||||||
|
flutter pub run flutter_app_name
|
||||||
|
|
||||||
|
生成json.jc.dart文件
|
||||||
|
flutter pub run build_runner build --delete-conflicting-outputs
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 18 KiB |
BIN
assets/images/ql_splash.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
2
lib/module/env/env_page.dart
vendored
@@ -86,7 +86,7 @@ class _EnvPageState extends State<EnvPage> {
|
|||||||
},
|
},
|
||||||
model: envProvider,
|
model: envProvider,
|
||||||
onReady: (viewModel) {
|
onReady: (viewModel) {
|
||||||
viewModel.loadData(context);
|
viewModel.loadData();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,15 +125,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
|||||||
}
|
}
|
||||||
WidgetsBinding.instance?.endOfFrame;
|
WidgetsBinding.instance?.endOfFrame;
|
||||||
},
|
},
|
||||||
child: ColorFiltered(
|
child: Image.asset(
|
||||||
colorFilter: ColorFilter.mode(
|
"assets/images/ql.png",
|
||||||
ref.watch(themeProvider).primaryColor,
|
height: 45,
|
||||||
BlendMode.srcIn,
|
|
||||||
),
|
|
||||||
child: Image.asset(
|
|
||||||
"assets/images/ql.png",
|
|
||||||
height: 45,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -6,20 +6,30 @@ class TaskLogBean {
|
|||||||
String? name;
|
String? name;
|
||||||
bool? isDir;
|
bool? isDir;
|
||||||
List<String>? files;
|
List<String>? files;
|
||||||
|
List<Children>? children;
|
||||||
|
|
||||||
TaskLogBean({this.name, this.isDir, this.files});
|
TaskLogBean({this.name, this.files});
|
||||||
|
|
||||||
TaskLogBean.fromJson(Map<String, dynamic> json) {
|
TaskLogBean.fromJson(Map<String, dynamic> json) {
|
||||||
name = json['name'];
|
name = json['name'] ?? json['title'];
|
||||||
isDir = json['isDir'];
|
isDir = json['isDir'] ?? (json['type'] == "directory");
|
||||||
files = json['files'].cast<String>();
|
|
||||||
|
files = json['files']?.cast<String>();
|
||||||
|
if (json['children'] != null) {
|
||||||
|
children = <Children>[];
|
||||||
|
json['children'].forEach((v) {
|
||||||
|
children!.add(Children.fromJson(v));
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
data['name'] = this.name;
|
data['name'] = this.name;
|
||||||
data['isDir'] = this.isDir;
|
|
||||||
data['files'] = this.files;
|
data['files'] = this.files;
|
||||||
|
if (this.children != null) {
|
||||||
|
data['children'] = this.children!.map((v) => v.toJson()).toList();
|
||||||
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -27,3 +37,31 @@ class TaskLogBean {
|
|||||||
return TaskLogBean.fromJson(json);
|
return TaskLogBean.fromJson(json);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Children {
|
||||||
|
String? title;
|
||||||
|
String? value;
|
||||||
|
String? type;
|
||||||
|
String? key;
|
||||||
|
String? parent;
|
||||||
|
|
||||||
|
Children({this.title, this.value, this.type, this.key, this.parent});
|
||||||
|
|
||||||
|
Children.fromJson(Map<String, dynamic> json) {
|
||||||
|
title = json['title'];
|
||||||
|
value = json['value'];
|
||||||
|
type = json['type'];
|
||||||
|
key = json['key'];
|
||||||
|
parent = json['parent'];
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||||
|
data['title'] = this.title;
|
||||||
|
data['value'] = this.value;
|
||||||
|
data['type'] = this.type;
|
||||||
|
data['key'] = this.key;
|
||||||
|
data['parent'] = this.parent;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -43,40 +43,66 @@ class _TaskLogPageState extends ConsumerState<TaskLogPage> with LazyLoadState<Ta
|
|||||||
color: ref.watch(themeProvider).themeColor.settingBgColor(),
|
color: ref.watch(themeProvider).themeColor.settingBgColor(),
|
||||||
child: (item.isDir ?? false)
|
child: (item.isDir ?? false)
|
||||||
? ExpansionTile(
|
? ExpansionTile(
|
||||||
title: Text(
|
title: Text(
|
||||||
item.name ?? "",
|
item.name ?? "",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: ref.watch(themeProvider).themeColor.titleColor(),
|
color: ref.watch(themeProvider).themeColor.titleColor(),
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
children: item.files!
|
children: (item.files?.isNotEmpty ?? false)
|
||||||
.map((e) => ListTile(
|
? item.files!
|
||||||
onTap: () {
|
.map((e) => ListTile(
|
||||||
Navigator.of(context).pushNamed(Routes.routeTaskLogDetail, arguments: item.name! + "/" + e);
|
onTap: () {
|
||||||
},
|
Navigator.of(context).pushNamed(Routes.routeTaskLogDetail, arguments: {
|
||||||
title: Text(
|
"path": item.name,
|
||||||
e,
|
"title": e,
|
||||||
style: TextStyle(
|
});
|
||||||
color: ref.watch(themeProvider).themeColor.titleColor(),
|
},
|
||||||
fontSize: 14,
|
title: Text(
|
||||||
),
|
e,
|
||||||
),
|
style: TextStyle(
|
||||||
))
|
color: ref.watch(themeProvider).themeColor.titleColor(),
|
||||||
.toList(),
|
fontSize: 14,
|
||||||
)
|
|
||||||
: ListTile(
|
|
||||||
onTap: () {
|
|
||||||
Navigator.of(context).pushNamed(Routes.routeTaskLogDetail, arguments: item.name);
|
|
||||||
},
|
|
||||||
title: Text(
|
|
||||||
item.name ?? "",
|
|
||||||
style: TextStyle(
|
|
||||||
color: ref.watch(themeProvider).themeColor.titleColor(),
|
|
||||||
fontSize: 16,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
|
),
|
||||||
|
))
|
||||||
|
.toList()
|
||||||
|
: (item.children ?? [])
|
||||||
|
.map((e) => ListTile(
|
||||||
|
onTap: () {
|
||||||
|
Navigator.of(context).pushNamed(Routes.routeTaskLogDetail, arguments: {
|
||||||
|
"path": item.name,
|
||||||
|
"title": e.title,
|
||||||
|
});
|
||||||
|
},
|
||||||
|
title: Text(
|
||||||
|
e.title ?? "",
|
||||||
|
style: TextStyle(
|
||||||
|
color: ref.watch(themeProvider).themeColor.titleColor(),
|
||||||
|
fontSize: 14,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
))
|
||||||
|
.toList(),
|
||||||
|
)
|
||||||
|
: ListTile(
|
||||||
|
onTap: () {
|
||||||
|
if (item.isDir ?? false) {
|
||||||
|
"该文件夹为空".toast();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Navigator.of(context).pushNamed(Routes.routeTaskLogDetail, arguments: item.name);
|
||||||
|
},
|
||||||
|
title: Text(
|
||||||
|
item.name ?? "",
|
||||||
|
style: TextStyle(
|
||||||
|
color: ref.watch(themeProvider).themeColor.titleColor(),
|
||||||
|
fontSize: 16,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
itemCount: list.length,
|
itemCount: list.length,
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class _TaskPageState extends ConsumerState<TaskPage> {
|
|||||||
},
|
},
|
||||||
model: taskProvider,
|
model: taskProvider,
|
||||||
onReady: (viewModel) {
|
onReady: (viewModel) {
|
||||||
viewModel.loadData(context);
|
viewModel.loadData();
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ flutter:
|
|||||||
assets:
|
assets:
|
||||||
- assets/images/
|
- assets/images/
|
||||||
flutter_app_name:
|
flutter_app_name:
|
||||||
name: "青龙"
|
name: "青龙客户端"
|
||||||
|
|
||||||
flutter_icons:
|
flutter_icons:
|
||||||
image_path_android: "assets/images/ql.png"
|
image_path_android: "assets/images/ql.png"
|
||||||
|
|||||||