feat: flutter ui integration

This commit is contained in:
levi authored and monkeyWie committed 2022-10-27 13:58:43 +08:00
1 parent 0fc133e46d
commit c4a30dc4c2
170 files changed
+7783 -1

No files matched your search

@@ -0,0 +1,51 @@
import 'package:file_selector/file_selector.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../util/mac_secure_util.dart';
class DirectorySelector extends StatefulWidget {
final TextEditingController controller;
final bool showLabel;
const DirectorySelector(
{Key? key, required this.controller, this.showLabel = true})
: super(key: key);
@override
State<DirectorySelector> createState() => _DirectorySelectorState();
}
class _DirectorySelectorState extends State<DirectorySelector> {
@override
Widget build(BuildContext context) {
return Row(
children: [
Expanded(
child: TextFormField(
readOnly: true,
controller: widget.controller,
decoration: widget.showLabel
? const InputDecoration(
labelText: "下载目录",
)
: null,
validator: (v) {
return v!.trim().isNotEmpty ? null : "请选择下载目录";
},
)),
IconButton(
icon: const Icon(Icons.folder_open),
onPressed: () async {
if (GetPlatform.isDesktop) {
var dir = await getDirectoryPath();
if (dir != null) {
widget.controller.text = dir;
MacSecureUtil.saveBookmark(dir);
}
}
})
],
);
}
}
+58
View File
@@ -0,0 +1,58 @@
import 'package:flutter/material.dart';
import 'package:gopeed/util/util.dart';
import '../api/model/resource.dart';
class FileListView extends StatefulWidget {
final List<FileInfo> files;
final List<bool> values;
const FileListView({
Key? key,
required this.files,
required this.values,
}) : super(key: key);
@override
State<FileListView> createState() => _FileListViewState();
}
class _FileListViewState extends State<FileListView> {
List<FileInfo> get _files => widget.files;
List<bool> get _values => widget.values;
@override
Widget build(BuildContext context) {
final themeData = Theme.of(context);
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Padding(padding: EdgeInsets.only(top: 10)),
Text("选择文件", style: TextStyle(color: themeData.hintColor)),
Expanded(
child: Container(
margin: const EdgeInsets.only(top: 10),
decoration: BoxDecoration(
border: Border.all(color: Colors.grey, width: 1),
borderRadius: BorderRadius.circular(5)),
child: ListView.builder(
itemCount: _files.length,
itemBuilder: (context, index) {
var file = _files[index];
return CheckboxListTile(
value: _values[index],
onChanged: (value) {
setState(() {
_values[index] = value!;
});
},
title: Text(Util.buildPath(file.path, file.name)),
subtitle: Text(Util.fmtByte(file.size)),
secondary: const Icon(Icons.description),
);
}))),
],
);
}
}