Browse Source

[New]新增文件页

zhipeng 1 year ago
parent
commit
d358ce8a70

BIN
assets/images/icon_files_new_dir.webp


BIN
assets/images/icon_more.webp


BIN
assets/images/icon_search.webp


+ 0 - 2
lib/main.dart

@@ -1,6 +1,5 @@
 import 'package:electronic_assistant/resource/string_source.dart';
 import 'package:electronic_assistant/router/app_pages.dart';
-import 'package:electronic_assistant/router/route_path.dart';
 import 'package:flutter/material.dart';
 import 'package:get/get_navigation/src/root/get_material_app.dart';
 
@@ -17,7 +16,6 @@ class MyApp extends StatelessWidget {
     return GetMaterialApp(
       title: 'Flutter Demo',
       getPages: AppPage.pages,
-      initialBinding: AppPage.binding,
       initialRoute: RoutePath.splash,
       theme: ThemeData(
         colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),

+ 10 - 0
lib/module/files/controller.dart

@@ -0,0 +1,10 @@
+import 'package:electronic_assistant/base/base_controller.dart';
+
+class FilesController extends BaseController {
+
+  @override
+  void onInit() {
+    // TODO: implement onInit
+    super.onInit();
+  }
+}

+ 77 - 0
lib/module/files/view.dart

@@ -0,0 +1,77 @@
+import 'package:electronic_assistant/base/base_page.dart';
+import 'package:electronic_assistant/module/files/controller.dart';
+import 'package:flutter/material.dart';
+
+import '../../resource/assets.gen.dart';
+
+class FilesPage extends BasePage<FilesController> {
+  const FilesPage({super.key});
+
+  @override
+  Widget? buildBody(BuildContext context) {
+    return Flex(
+      direction: Axis.vertical,
+      children: [
+        Column(
+          children: [
+            AppBar(
+              title: const Text('文件夹'),
+              actions: [
+                IconButton(
+                  onPressed: () {},
+                  icon: ImageIcon(Assets.images.iconFilesNewDir.provider()),
+                ),
+                IconButton(
+                  onPressed: () {},
+                  icon: ImageIcon(Assets.images.iconMore.provider()),
+                ),
+              ],
+            ),
+            Container(
+              height: 36,
+              decoration: BoxDecoration(
+                color: Colors.white,
+                borderRadius: BorderRadius.circular(8),
+              ),
+              child: Flex(
+                direction: Axis.horizontal,
+                children: [
+                  ImageIcon(Assets.images.iconSearch.provider()),
+                  const Expanded(
+                      child: TextField(
+                    decoration: InputDecoration(
+                      hintText: '搜索所有文件标题 / 内容',
+                    ),
+                  ))
+                ],
+              ),
+            ),
+          ],
+        ),
+        Expanded(
+            child: NestedScrollView(
+          headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) {
+            return <Widget>[
+              GridView.builder(
+                gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
+                  crossAxisCount: 2,
+                ),
+                itemBuilder: (BuildContext context, int index) {
+                  return const SizedBox();
+                },
+              ),
+              const Text('全部谈话'),
+            ];
+          },
+          body: AnimatedList(
+            initialItemCount: 10,
+            itemBuilder:
+                (BuildContext context, int index, Animation<double> animation) {
+              return const SizedBox();
+            },
+          ),
+        ))
+      ],
+    );
+  }
+}

+ 104 - 0
lib/resource/assets.gen.dart

@@ -7,6 +7,110 @@
 // ignore_for_file: type=lint
 // ignore_for_file: directives_ordering,unnecessary_import,implicit_dynamic_list_literal,deprecated_member_use
 
+import 'package:flutter/widgets.dart';
+
+class $AssetsImagesGen {
+  const $AssetsImagesGen();
+
+  /// File path: assets/images/icon_files_new_dir.webp
+  AssetGenImage get iconFilesNewDir =>
+      const AssetGenImage('assets/images/icon_files_new_dir.webp');
+
+  /// File path: assets/images/icon_more.webp
+  AssetGenImage get iconMore =>
+      const AssetGenImage('assets/images/icon_more.webp');
+
+  /// File path: assets/images/icon_search.webp
+  AssetGenImage get iconSearch =>
+      const AssetGenImage('assets/images/icon_search.webp');
+
+  /// List of all assets
+  List<AssetGenImage> get values => [iconFilesNewDir, iconMore, iconSearch];
+}
+
 class Assets {
   Assets._();
+
+  static const $AssetsImagesGen images = $AssetsImagesGen();
+}
+
+class AssetGenImage {
+  const AssetGenImage(
+    this._assetName, {
+    this.size,
+    this.flavors = const {},
+  });
+
+  final String _assetName;
+
+  final Size? size;
+  final Set<String> flavors;
+
+  Image image({
+    Key? key,
+    AssetBundle? bundle,
+    ImageFrameBuilder? frameBuilder,
+    ImageErrorWidgetBuilder? errorBuilder,
+    String? semanticLabel,
+    bool excludeFromSemantics = false,
+    double? scale,
+    double? width,
+    double? height,
+    Color? color,
+    Animation<double>? opacity,
+    BlendMode? colorBlendMode,
+    BoxFit? fit,
+    AlignmentGeometry alignment = Alignment.center,
+    ImageRepeat repeat = ImageRepeat.noRepeat,
+    Rect? centerSlice,
+    bool matchTextDirection = false,
+    bool gaplessPlayback = false,
+    bool isAntiAlias = false,
+    String? package,
+    FilterQuality filterQuality = FilterQuality.low,
+    int? cacheWidth,
+    int? cacheHeight,
+  }) {
+    return Image.asset(
+      _assetName,
+      key: key,
+      bundle: bundle,
+      frameBuilder: frameBuilder,
+      errorBuilder: errorBuilder,
+      semanticLabel: semanticLabel,
+      excludeFromSemantics: excludeFromSemantics,
+      scale: scale,
+      width: width,
+      height: height,
+      color: color,
+      opacity: opacity,
+      colorBlendMode: colorBlendMode,
+      fit: fit,
+      alignment: alignment,
+      repeat: repeat,
+      centerSlice: centerSlice,
+      matchTextDirection: matchTextDirection,
+      gaplessPlayback: gaplessPlayback,
+      isAntiAlias: isAntiAlias,
+      package: package,
+      filterQuality: filterQuality,
+      cacheWidth: cacheWidth,
+      cacheHeight: cacheHeight,
+    );
+  }
+
+  ImageProvider provider({
+    AssetBundle? bundle,
+    String? package,
+  }) {
+    return AssetImage(
+      _assetName,
+      bundle: bundle,
+      package: package,
+    );
+  }
+
+  String get path => _assetName;
+
+  String get keyName => _assetName;
 }

+ 10 - 9
lib/router/app_pages.dart

@@ -1,28 +1,29 @@
-import 'package:electronic_assistant/router/route_path.dart';
 import 'package:get/get.dart';
 
+import '../module/files/view.dart';
 import '../module/login/view.dart';
 import '../module/main/view.dart';
-import '../module/splash/controller.dart';
 import '../module/splash/view.dart';
 
 abstract class AppPage {
   static final pages = <GetPage>[
     ...generalPages,
   ];
-
-  static final binding = AppBinding();
 }
 
-class AppBinding extends Bindings {
-  @override
-  void dependencies() {
-    Get.lazyPut(() => SplashController());
-  }
+abstract class RoutePath {
+  static const splash = '/';
+
+  static const login = '/login';
+
+  static const mainTab = '/mainTab';
+
+  static const files = '/files';
 }
 
 final generalPages = [
   GetPage(name: RoutePath.splash, page: () => const SplashPage()),
   GetPage(name: RoutePath.login, page: () => const LoginPage()),
   GetPage(name: RoutePath.mainTab, page: () => const MainTabPage()),
+  GetPage(name: RoutePath.files, page: () => const FilesPage()),
 ];

+ 0 - 7
lib/router/route_path.dart

@@ -1,7 +0,0 @@
-abstract class RoutePath {
-  static const splash = '/';
-
-  static const login = '/login';
-
-  static const mainTab = '/mainTab';
-}