同步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 |
@ -551,4 +551,4 @@
|
||||
/* End XCConfigurationList section */
|
||||
};
|
||||
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
||||
}
|
||||
}
|
||||
2
lib/module/env/env_page.dart
vendored
@ -86,7 +86,7 @@ class _EnvPageState extends State<EnvPage> {
|
||||
},
|
||||
model: envProvider,
|
||||
onReady: (viewModel) {
|
||||
viewModel.loadData(context);
|
||||
viewModel.loadData();
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@ -125,15 +125,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
}
|
||||
WidgetsBinding.instance?.endOfFrame;
|
||||
},
|
||||
child: ColorFiltered(
|
||||
colorFilter: ColorFilter.mode(
|
||||
ref.watch(themeProvider).primaryColor,
|
||||
BlendMode.srcIn,
|
||||
),
|
||||
child: Image.asset(
|
||||
"assets/images/ql.png",
|
||||
height: 45,
|
||||
),
|
||||
child: Image.asset(
|
||||
"assets/images/ql.png",
|
||||
height: 45,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
@ -6,20 +6,30 @@ class TaskLogBean {
|
||||
String? name;
|
||||
bool? isDir;
|
||||
List<String>? files;
|
||||
List<Children>? children;
|
||||
|
||||
TaskLogBean({this.name, this.isDir, this.files});
|
||||
TaskLogBean({this.name, this.files});
|
||||
|
||||
TaskLogBean.fromJson(Map<String, dynamic> json) {
|
||||
name = json['name'];
|
||||
isDir = json['isDir'];
|
||||
files = json['files'].cast<String>();
|
||||
name = json['name'] ?? json['title'];
|
||||
isDir = json['isDir'] ?? (json['type'] == "directory");
|
||||
|
||||
files = json['files']?.cast<String>();
|
||||
if (json['children'] != null) {
|
||||
children = <Children>[];
|
||||
json['children'].forEach((v) {
|
||||
children!.add(Children.fromJson(v));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['name'] = this.name;
|
||||
data['isDir'] = this.isDir;
|
||||
data['files'] = this.files;
|
||||
if (this.children != null) {
|
||||
data['children'] = this.children!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
@ -27,3 +37,31 @@ class TaskLogBean {
|
||||
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(),
|
||||
child: (item.isDir ?? false)
|
||||
? ExpansionTile(
|
||||
title: Text(
|
||||
item.name ?? "",
|
||||
style: TextStyle(
|
||||
color: ref.watch(themeProvider).themeColor.titleColor(),
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
children: item.files!
|
||||
.map((e) => ListTile(
|
||||
onTap: () {
|
||||
Navigator.of(context).pushNamed(Routes.routeTaskLogDetail, arguments: item.name! + "/" + e);
|
||||
},
|
||||
title: Text(
|
||||
e,
|
||||
style: TextStyle(
|
||||
color: ref.watch(themeProvider).themeColor.titleColor(),
|
||||
fontSize: 14,
|
||||
),
|
||||
),
|
||||
))
|
||||
.toList(),
|
||||
)
|
||||
: 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,
|
||||
),
|
||||
),
|
||||
title: Text(
|
||||
item.name ?? "",
|
||||
style: TextStyle(
|
||||
color: ref.watch(themeProvider).themeColor.titleColor(),
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
children: (item.files?.isNotEmpty ?? false)
|
||||
? item.files!
|
||||
.map((e) => ListTile(
|
||||
onTap: () {
|
||||
Navigator.of(context).pushNamed(Routes.routeTaskLogDetail, arguments: {
|
||||
"path": item.name,
|
||||
"title": e,
|
||||
});
|
||||
},
|
||||
title: Text(
|
||||
e,
|
||||
style: TextStyle(
|
||||
color: ref.watch(themeProvider).themeColor.titleColor(),
|
||||
fontSize: 14,
|
||||
),
|
||||
),
|
||||
))
|
||||
.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,
|
||||
|
||||
@ -41,7 +41,7 @@ class _TaskPageState extends ConsumerState<TaskPage> {
|
||||
},
|
||||
model: taskProvider,
|
||||
onReady: (viewModel) {
|
||||
viewModel.loadData(context);
|
||||
viewModel.loadData();
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
@ -63,7 +63,7 @@ flutter:
|
||||
assets:
|
||||
- assets/images/
|
||||
flutter_app_name:
|
||||
name: "青龙"
|
||||
name: "青龙客户端"
|
||||
|
||||
flutter_icons:
|
||||
image_path_android: "assets/images/ql.png"
|
||||
|
||||