Flutter快速搭建UI框架插件getx_scaffold的使用

Flutter快速搭建UI框架插件getx_scaffold的使用

一、关于 GetX Scaffold

GetXScaffold 是基于 GetX 框架和一些常用插件构建的一套快速开发模板。它包括了全局方法、扩展方法、工具类、封装的组件、对话框、网络请求工具、控制器封装、主题和国际化实现等。GetXScaffold 的目的是提高开发效率,减少重复代码,降低开发成本。

二、适配 Flutter 版本

Version Flutter 版本
0.0.3 3.19.5
0.0.4 3.22.2
0.1.2 3.24.1
0.2.0 3.24.1

三、更新日志

  • 0.2.0
    • 从 0.2.0 开始推荐使用 Material2 重新适配,解决 Material3 的配色问题。
    • 适配 Flutter SDK 版本到 3.24.1。
    • 修复 ButtonX.iconiconSize 参数不生效的问题。
    • 新增滑动验证码 Dialog。
    • HttpService 新增错误拦截和请求拦截。
    • EncryptUtilExString 新增 sha1、sha256、sha512 散列算法。
    • 新增随机数生成和 Nonce 生成的全局方法。
    • refreshAppui 延时 300ms 刷新,处理主题更新后显示不正常的问题。
    • Android 端修改主题自动修改底部导航栏颜色。

四、运行示例项目

cd example
flutter pub get
flutter run

如果提示 Error: Type 'UnmodifiableUint8ListView' not found,请更新 win32 库:

flutter pub upgrade win32

五、快速开始

1. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  getx_scaffold: ^0.0.1

  # 如果您的项目中需要使用国际化,请添加以下依赖
  flutter_localizations:
    sdk: flutter
2. 初始化脚手架

main.dart 中初始化 GetXScaffold

import 'package:getx_scaffold/getx_scaffold.dart';

void main() async {
  WidgetsBinding widgetsBinding = await init(
    isDebug: kDebugMode,
    logTag: 'GetxScaffold',
    supportedLocales: TranslationLibrary.supportedLocales,
  );
  runApp(
    GetxApp(
      // 设计稿尺寸 单位:dp
      designSize: const Size(390, 844),
      // Getx Log
      enableLog: kDebugMode,
      // 默认的跳转动画
      defaultTransition: Transition.rightToLeft,
      // 主题模式
      themeMode: GlobalService.to.themeMode,
      // 主题
      theme: AppTheme.light,
      // Dark主题
      darkTheme: AppTheme.dark,
      // 国际化配置
      locale: GlobalService.to.locale,
      translations: TranslationLibrary(),
      fallbackLocale: TranslationLibrary.fallbackLocale,
      supportedLocales: TranslationLibrary.supportedLocales,
      localizationsDelegates: TranslationLibrary.localizationsDelegates,
      // AppTitle
      title: 'GetxScaffold',
      // 首页
      home: const HomePage(),
      // Builder
      builder: (context, widget) {
        // do something....
        return widget!;
      },
    ),
  );
}
3. 定义主题

从 0.2.0 开始推荐使用 Material2 重新适配。以下是主题示例:

import 'package:flutter/material.dart';

class AppTheme {
  static const String fontMontserrat = 'Montserrat';
  static const Color themeColor = Color.fromARGB(255, 11, 107, 47);
  static const Color darkThemeColor = Color.fromARGB(255, 12, 16, 121);

  /// 亮色主题样式
  static ThemeData light = ThemeData(
    useMaterial3: false,
    fontFamily: fontMontserrat,
    colorScheme: ColorScheme.fromSeed(
      seedColor: themeColor,
      brightness: Brightness.light,
    ),
    appBarTheme: const AppBarTheme(
      backgroundColor: Colors.white,
      foregroundColor: Color.fromARGB(200, 0, 0, 0),
      centerTitle: true,
      titleTextStyle: TextStyle(
        fontSize: 18,
        fontWeight: FontWeight.bold,
        color: Color.fromARGB(200, 0, 0, 0),
      ),
    ),
  );

  /// 暗色主题样式
  static ThemeData dark = ThemeData(
    useMaterial3: false,
    fontFamily: fontMontserrat,
    colorScheme: ColorScheme.fromSeed(
      seedColor: darkThemeColor,
      brightness: Brightness.dark,
    ),
    appBarTheme: const AppBarTheme(
      centerTitle: true,
      titleTextStyle: TextStyle(
        fontSize: 18,
        fontWeight: FontWeight.bold,
      ),
    ),
    bottomAppBarTheme: const BottomAppBarTheme(
      color: Color.fromARGB(255, 34, 34, 34),
    ),
  );
}
4. 国际化

创建 TranslationLibrary 并实现以下方法:

import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:getx_scaffold/getx_scaffold.dart';

import 'locales/locale_en.dart';
import 'locales/locale_es.dart';
import 'locales/locale_zh.dart';

class TranslationLibrary extends Translations {
  static const fallbackLocale = Locale('zh', 'CN');
  static const supportedLocales = [
    Locale('zh', 'CN'),
    Locale('en', 'US'),
    Locale('es', 'ES'),
  ];

  @override
  Map<String, Map<String, String>> get keys => {
        'zh': zh,
        'en': en,
        'es': es,
      };

  static const localizationsDelegates = [
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
  ];
}

main.dart 中加入以下代码:

// 国际化配置
locale: GlobalService.to.locale,
translations: TranslationLibrary(),
fallbackLocale: TranslationLibrary.fallbackLocale,
supportedLocales: TranslationLibrary.supportedLocales,
localizationsDelegates: TranslationLibrary.localizationsDelegates,
5. 添加页面

所有页面使用 GetViewGetxController 视图与逻辑分离的开发方式。所有 GetxController 必须混入 BaseControllerMixin,以响应全局刷新。

HomePage.dart
import 'package:flutter/material.dart';
import 'package:example/common/langs/index.dart';
import 'package:getx_scaffold/getx_scaffold.dart';

import 'index.dart';

class HomePage extends GetView<HomeController> {
  const HomePage({super.key});

  // 主视图
  Widget _buildView() {
    return <Widget>[
      ListTile(
        title: Text(TextKey.zhuTi.tr),
        onTap: () {
          Get.to(() => const ThemePage());
        },
      ),
      ListTile(
        title: Text(TextKey.yuYan.tr),
        onTap: () {
          Get.to(() => const LanguagePage());
        },
      ),
    ]
        .toListView(
          separator: const DividerX(),
        )
        .scrollbar()
        .safeArea();
  }

  Widget _buildFloatingActionButton() {
    return FloatingActionButton(
      onPressed: () {},
      child: const Icon(Icons.info),
    ).padding(all: 20.w);
  }

  @override
  Widget build(BuildContext context) {
    return GetBuilder<HomeController>(
      init: HomeController(),
      id: 'home',
      builder: (_) {
        return DoublePressBackWidget(
          child: Scaffold(
            appBar: AppBar(
              title: const Text("GetxScaffold"),
              centerTitle: true,
              elevation: 1,
            ),
            floatingActionButton: _buildFloatingActionButton(),
            body: _buildView(),
          ),
        );
      },
    );
  }
}
HomeController.dart
import 'package:getx_scaffold/getx_scaffold.dart';

class HomeController extends GetxController with BaseControllerMixin {
  @override
  String get builderId => 'home';

  HomeController();

  @override
  void onInit() {
    super.onInit();
    updateUi();
    back();
    delayedBack();
  }

  @override
  bool get listenLifecycleEvent => true;

  @override
  void onDetached() {
    log('onDetached');
  }

  @override
  void onHidden() {
    log('onHidden');
  }

  @override
  void onInactive() {
    log('onInactive');
  }

  @override
  void onPaused() {
    log('onPaused');
  }

  @override
  void onResumed() {
    log('onResumed');
  }
}

六、全局方法

GetXScaffold 提供了丰富的全局方法,例如:

  • 获取当前时间戳
  • 判断设备是否连接网络
  • 显示 Toast
  • 显示加载对话框
  • 切换主题模式
  • 更改语言
  • 打开网页
  • 拨打电话
  • 申请权限

七、扩展方法

GetXScaffold 提供了对 StringnumList<Widget>Widget 的扩展方法,方便开发者快速构建 UI。

八、内置组件

GetXScaffold 封装了一些常用的组件,如 TextXButtonXIconXSpinKitLottie 等,简化了组件的使用。

九、网络请求

GetXScaffoldDio 进行了二次封装,提供了更简洁的调用方式和完整的请求日志。通过 HttpService 进行调用。

十、权限管理

GetXScaffold 封装了权限申请的逻辑,简化了权限申请流程。提供了 requestCameraPermissionrequestPhotosPermission 等方法。

示例代码

以下是 main.dart 的完整示例代码:

import 'package:example/common/langs/index.dart';
import 'package:example/pages/home/index.dart';
import 'package:example/common/styles/theme.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:getx_scaffold/getx_scaffold.dart';

void main() async {
  WidgetsBinding widgetsBinding = await init(
    isDebug: kDebugMode,
    logTag: 'GetxScaffold',
    supportedLocales: TranslationLibrary.supportedLocales,
  );
  FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
  runApp(
    GetxApp(
      designSize: const Size(390, 844),
      enableLog: kDebugMode,
      defaultTransition: Transition.rightToLeft,
      themeMode: GlobalService.to.themeMode,
      theme: AppTheme.light,
      darkTheme: AppTheme.dark,
      locale: GlobalService.to.locale,
      translations: TranslationLibrary(),
      fallbackLocale: TranslationLibrary.fallbackLocale,
      supportedLocales: TranslationLibrary.supportedLocales,
      localizationsDelegates: TranslationLibrary.localizationsDelegates,
      title: 'GetxScaffold',
      home: const HomePage(),
      builder: (context, widget) {
        return widget!;
      },
    ),
  );
}

更多关于Flutter快速搭建UI框架插件getx_scaffold的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter快速搭建UI框架插件getx_scaffold的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,getx_scaffold 是一个用于 Flutter 的插件,旨在帮助开发者快速搭建使用 GetX 状态管理库的 UI 框架。以下是一个使用 getx_scaffold 插件的简单示例,展示如何快速搭建一个包含导航栏和页面的应用程序。

首先,确保你已经在 pubspec.yaml 文件中添加了 getgetx_scaffold 的依赖:

dependencies:
  flutter:
    sdk: flutter
  get: ^4.0.0  # 请确保使用最新版本
  getx_scaffold: ^2.0.0  # 请确保使用最新版本

然后,运行 flutter pub get 来安装依赖。

接下来,让我们编写一些代码来展示如何使用 getx_scaffold

main.dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:getx_scaffold/getx_scaffold.dart';
import 'home_controller.dart';
import 'second_page.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      title: 'GetX Scaffold Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: GetXScaffold(
        appBar: AppBar(
          title: Text('GetX Scaffold Demo'),
        ),
        drawer: Drawer(
          child: ListView(
            padding: EdgeInsets.zero,
            children: <Widget>[
              DrawerHeader(
                child: Text('Drawer Header'),
                decoration: BoxDecoration(
                  color: Colors.blue,
                ),
              ),
              ListTile(
                title: Text('Home'),
                onTap: () {
                  Get.back();
                },
              ),
              ListTile(
                title: Text('Second Page'),
                onTap: () {
                  Get.toNamed('/second');
                },
              ),
            ],
          ),
        ),
        body: HomePage(),
        bottomNavigationBar: BottomNavigationBar(
          items: [
            BottomNavigationBarItem(
              icon: Icon(Icons.home),
              label: 'Home',
            ),
            BottomNavigationBarItem(
              icon: Icon(Icons.settings),
              label: 'Settings',
            ),
          ],
          currentIndex: 0,
          onTap: (index) {
            // Handle bottom navigation taps here
          },
        ),
        routes: {
          '/second': (context) => SecondPage(),
        },
      ),
    );
  }
}

home_controller.dart

import 'package:get/get.dart';

class HomeController extends GetxController {
  // 在这里添加你的控制器逻辑
}

home_page.dart

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'home_controller.dart';

class HomePage extends GetView<HomeController> {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Home Page'),
    );
  }
}

second_page.dart

import 'package:flutter/material.dart';

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: Text('Second Page'),
    );
  }
}

说明

  1. 主应用 (main.dart):

    • 使用 GetMaterialApp 作为应用的根。
    • 使用 GetXScaffold 创建一个包含导航栏、抽屉菜单和底部导航栏的页面。
    • 定义了一个路由 /second 指向 SecondPage
  2. 控制器 (home_controller.dart):

    • 这是一个简单的 GetX 控制器,你可以在这里添加你的业务逻辑。
  3. 首页 (home_page.dart):

    • 这是一个使用 GetView 连接的页面,它依赖于 HomeController
  4. 第二页 (second_page.dart):

    • 这是一个简单的无状态页面,用于展示第二个页面。

这样,你就创建了一个使用 getx_scaffold 插件的 Flutter 应用,它包含了一个导航栏、抽屉菜单和底部导航栏。虽然 getx_scaffold 插件本身简化了这些组件的集成,但在这个示例中,我们并没有直接使用 getx_scaffold 提供的特定功能(因为 getx_scaffold 主要是集成了 GetX 和 Material Scaffold 的功能),而是展示了如何结合使用 GetX 和 Flutter 的 Material 组件来快速搭建一个 UI 框架。如果你有更具体的需求,可以查阅 getx_scaffold 的官方文档以获取更多高级用法。

回到顶部