Flutter多功能开发框架插件masamune的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter多功能开发框架插件masamune的使用

Introduction

Masamune Framework是由mathru.net开发的一个Flutter多功能开发框架插件,旨在减少应用程序开发中的大部分编码工作。通过CLI工具生成代码模板和build_runner自动生成额外代码,使开发者能够专注于业务逻辑,同时确保代码的一致性和可维护性。以下是Masamune Framework的一些核心功能:

  • CLI代码模板生成
  • 自动代码生成
  • 路由管理
  • 数据库支持(NoSQL)
  • 状态管理
  • 翻译管理
  • 主题管理
  • 共享偏好设置
  • 表单构建
  • UI支持
  • Firebase/Firestore集成

Implementation sample

[GitHub] | [YouTube] | [Packages] | [Twitter] | [Threads] | [LinkedIn] | [mathru.net]


Installation

安装CLI工具

flutter pub global activate katana_cli

添加Masamune Framework到现有项目

flutter pub add masamune
flutter pub add json_annotation
flutter pub add freezed_annotation
flutter pub add --dev build_runner
flutter pub add --dev masamune_builder
flutter pub add --dev json_serializable
flutter pub add --dev freezed

Project Creation

执行以下命令创建新项目:

katana create [Application ID(e.g. com.test.myapplication)]

这将自动完成以下配置:

  • 图片文件放置在assets文件夹下
  • 自动生成katana.yaml
  • 自动安装所需包
  • 自动设置VSCode启动器
  • 使用build_runner生成代码

Code Change Monitoring

使用build_runner监控代码变化并自动生成代码:

katana code watch

如果需要手动触发代码生成:

katana code generate

Implementation

Page

创建页面

katana code page [Page name]

页面类示例:

@immutable
@PagePath("test")
class TestPage extends PageScopedWidget {
  const TestPage({super.key});

  static const query = _$TestPageQuery();

  @override
  Widget build(BuildContext context, PageRef ref) {
    return UniversalScaffold();
  }
}

页面跳转

router.push(TestPage.query());
router.replace(TestPage.query());
router.pop();

设置初始页面

final initialQuery = TestPage.query();

Data Model

创建集合模型

katana code collection [Collection name]

集合模型类示例:

@freezed
@formValue
@immutable
@CollectionModelPath("test")
class TestModel with _$TestModel {
  const factory TestModel({
    required String name,
    String? test,
  }) = _TestModel;

  factory TestModel.fromJson(Map<String, Object?> json) => _$TestModelFromJson(json);

  static const document = _$TestModelDocumentQuery();
  static const collection = _$TestModelCollectionQuery();
  static const form = _$TestModelFormQuery();
}

使用模型

final testModelCollection = ref.app.model(TestModel.collection());
testModelCollection.load();

Controller

创建控制器:

katana code controller [Controller name]

控制器类示例:

@Controller(autoDisposeWhenUnreferenced: false)
class TestController extends ChangeNotifier {
  TestController();

  static const query = _$TestControllerQuery();
}

获取控制器:

final testController = ref.page.controller(TestController.query());

State Management

使用ref.app.modelref.(page/app).controller进行状态管理。


Translation

翻译通过Google Spreadsheet实现:

@GoogleSpreadSheetLocalize(
  "https://docs.google.com/spreadsheets/d/1bw7IXEr7BGkZ4U6on0OuF7HQkTMgDSm6u5ThpBkDPeo/edit#gid=551986808",
  version: 1,
)
class AppLocalize extends _$AppLocalize {}

使用翻译文本:

Text(l().success);

Theme Management

定义主题:

@appTheme
final theme = AppThemeData(
  primary: Colors.blue,
  secondary: Colors.cyan,
  onPrimary: Colors.white,
  onSecondary: Colors.white,
);

使用主题:

return UniversalScaffold(
  appBar: UniversalAppBar(title: Text("Title"), backgroundColor: theme.color.secondary),
  body: UniversalColumn(
    crossAxisAlignment: CrossAxisAlignment.start,
    children:[
      Center(child: CircleAvatar(backgroundImage: theme.asset.userIcon.provider)),
      Text("User Name", style: theme.text.displayMedium)
    ]
  )
);

Form Building

获取表单控制器:

final memo = const MemoModel(title: "", text: "");
final formController = ref.page.form(MemoModel.form(memo));

绘制表单并验证:

FormTextField(
  form: formController,
  onSaved: (value) => formController.value.copyWith(email: value),
),

FormButton(
  "Login",
  onPressed: () async {
    final LoginValue loginValue = formController.validate();
    if (loginValue == null) {
      return;
    }
    try {
      // Normal processing
    } catch (e) {
      // Error handling
    }
  },
),

UI Support

显示对话框:

Modal.alert(
  title: "Title",
  text: "Contents text",
  submitText: "OK",
  onSubmit: () {
    // Processing when the OK button is pressed
  },
);

响应式布局:

return UniversalScaffold(
  breakpoint: Breakpoint.sm,
  sideBar: UniversalSideBar(
    decoration: const BoxDecoration(
      border: Border(right: BorderSide(color: Colors.grey)),
    ),
    children: [
      for (var i = 0; i < 100; i++)
        ListTile(
          tileColor: Colors.blue,
          title: Text((i + 1).toString()),
        ),
    ],
  ),
  appBar: UniversalSliverAppBar(
    title: const Text("UniversalViewPage"),
    subtitle: const Text("UniversalViewPage"),
    titlePosition: UniversalAppBarTitlePosition.bottom,
    background: UniversalAppBarBackground(theme.asset.image.provider),
  ),
  body: UniversalListView(
    onRefresh: () {
      return Future.delayed(1.s);
    },
    padding: const EdgeInsets.only(top: 32),
    children: [
      UniversalColumn(
        children: [
          ...List.generate(100, (i) {
            return ListTile(
              tileColor: Colors.red,
              title: Text((i + 1).toString()),
            );
          }).mapResponsive(sm: 6, md: 4),
        ],
      ),
    ],
  ),
);

Authentication

用户注册和登录:

await appAuth.register(
  EmailAndPasswordAuthQuery.register(
    email: "test@email.com",
    password: "12345678",
  ),
);

await appAuth.signIn(
  EmailAndPasswordAuthQuery.signIn(
    email: "test@email.com",
    password: "12345678",
  ),
);

await appAuth.signOut();

File Storage

上传文件:

final storage = Storage(const StorageQuery("test/file"));

final pickedData = await FilePicker.platform.pickFiles();
storage.upload(pickedData.first.path);

Firebase/Firestore Support

添加Firebase相关包:

flutter pub add katana_auth_firebase
flutter pub add katana_model_firestore
flutter pub add katana_storage_firebase

初始化Firebase:

flutterfire configure

切换适配器:

final modelAdapter = FirestoreModelAdapter(options: DefaultFirebaseOptions.currentPlatform);
final authAdapter = FirebaseAuthAdapter(options: DefaultFirebaseOptions.currentPlatform);
final storageAdapter = FirebaseStorageAdapter(options: DefaultFirebaseOptions.currentPlatform);

示例代码

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

import 'package:flutter/material.dart';
import 'package:masamune/masamune.dart';

part 'main.theme.dart';
part 'main.localize.dart';

const title = "";

const initialQuery = null;

const modelAdapter = RuntimeModelAdapter();
const authAdapter = RuntimeAuthAdapter();
const storageAdapter = LocalStorageAdapter();
const functionsAdapter = RuntimeFunctionsAdapter();

@appTheme
final theme = AppThemeData(
  primary: Colors.blue,
  secondary: Colors.cyan,
  onPrimary: Colors.white,
  onSecondary: Colors.white,
);

final router = AppRouter(
  boot: null,
  initialQuery: initialQuery,
  redirect: [],
  pages: [],
);

final l = AppLocalize();

@GoogleSpreadSheetLocalize(
  [
    "https://docs.google.com/spreadsheets/d/1bw7IXEr7BGkZ4U6on0OuF7HQkTMgDSm6u5ThpBkDPeo/edit#gid=551986808"
  ],
  version: 1,
)
class AppLocalize extends _$AppLocalize {}

final appRef = AppRef();

final appAuth = Authentication();

final appFunction = Functions();

const flavor = String.fromEnvironment("FLAVOR");

void main() {
  runMasamuneApp(
    (adapters) => MasamuneApp(
      title: title,
      appRef: appRef,
      theme: theme,
      routerConfig: router,
      localize: l,
      authAdapter: authAdapter,
      modelAdapter: modelAdapter,
      storageAdapter: storageAdapter,
      functionsAdapter: functionsAdapter,
      masamuneAdapters: adapters,
    ),
  );
}

以上是Masamune Framework的核心功能和使用方法,希望对您有所帮助!


更多关于Flutter多功能开发框架插件masamune的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter多功能开发框架插件masamune的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter开发中,masamune 是一个功能丰富的多功能开发框架插件,它提供了一系列预构建的组件和功能,以加速开发过程。以下是一个简单的示例,展示如何在Flutter项目中使用 masamune 插件。

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

dependencies:
  flutter:
    sdk: flutter
  masamune: ^最新版本号  # 请替换为实际的最新版本号

然后,运行 flutter pub get 来获取依赖。

接下来,我们来看一个简单的示例,展示如何使用 masamune 中的一些功能。例如,使用 MasamuneApp 小部件来创建一个具有全局功能的 Flutter 应用。

import 'package:flutter/material.dart';
import 'package:masamune/masamune.dart';

void main() {
  // 初始化 MasamuneApp
  runApp(
    MasamuneApp(
      home: MyHomePage(),
      // 配置全局设置,如主题、语言等
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      // 配置其他全局功能,如用户认证、数据库连接等
      // authentication: MyAuthentication(),
      // database: MyDatabase(),
    ),
  );
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Masamune 示例'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // 使用 Masamune 的按钮组件
            MasamuneButton(
              text: '点击我',
              onPressed: () {
                // 触发点击事件
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('按钮被点击了!')),
                );
              },
            ),
            // 使用 Masamune 的间隔组件
            MasamuneGap(height: 20),
            // 使用 Masamune 的文本组件
            MasamuneText(
              '欢迎使用 Masamune!',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事情:

  1. 引入 masamune:在文件顶部引入了 masamune 包。
  2. 初始化 MasamuneApp:使用 MasamuneApp 小部件作为应用的根小部件,并配置了全局主题。
  3. 创建主页面:创建了一个简单的 MyHomePage 页面,其中包含 MasamuneButtonMasamuneGapMasamuneTextmasamune 提供的组件。

这只是 masamune 功能的冰山一角。masamune 还提供了用户认证、数据库操作、文件存储、通知推送等丰富的功能。你可以查阅 masamune 的官方文档来获取更多详细信息和高级用法。

请注意,由于 masamune 插件的功能非常丰富,具体使用时可能需要根据你的项目需求进行进一步的配置和定制。

回到顶部