Flutter插件objd_gen的使用方法

Flutter插件objd_gen的使用方法

objd_gen

这个包包含由source_gen生成的代码生成器。通过注解,可以更简洁地编写Widgets、Files、Packs和Projects。

Flutter插件objd_gen的安装

在你的pubspec.yaml文件中添加这个包作为开发依赖:

dev_dependencies:
  build_runner: 
  objd_gen: ^0.0.2

生成器会在与你注解文件相邻的位置创建新的dart类和函数。为了使它们可用,你需要使用part语句导入它们:

import 'package:objd/core.dart';

part '[your_filename].g.dart';

在编写完所有的Widgets后,你可以运行以下命令来生成相关的类和函数:

pub run build_runner build

如果你想在保存时自动重新生成,可以运行:

pub run build_runner watch

Widget

使用@Wdg注解可以使编写Widget变得更加简单。你可以给它一个带有所需参数的函数,该函数返回一个新的Widget,然后生成器会根据这个函数生成相应的Widget类。

例如:

@Wdg
Widget helloWorld() => Log('Hello World!');

运行build_runner后,会生成一个名为HelloWorld的新Widget(继承自函数名),因此建议使用小写函数名。

参数也可以像预期的那样工作,并且如果你需要,还可以访问到Widget的上下文:

@Wdg
Widget helloName(String name, {String lastname = '', required Context context}) =>
  For.of([
    Comment('This was generated by HelloName on version ${context.version}'),
    Log('Hello $name $lastname!'),
  ]);

这将转换为如下方式的Widget,你可以在项目中的任何地方使用它:

class HelloName extends Widget {
  final String name;
  final String lastname;

  HelloName(
    this.name, {
    this.lastname = '',
  });

  @override
  Widget generate(Context context) => helloName(
        name,
        lastname: lastname,
        context: context,
      );
}

File

使用@Func()注解可以简化编写Minecraft函数的过程。只需在应该包含在函数中的Widget变量上添加@Func()注解即可:

@Func()
final Widget load = HelloWorld();

这将读取变量名load并生成一个名为LoadFile的新变量,其中包含File Widget:

final File LoadFile = File(
  '/load',
  child: load,
);

@Func()的括号内,你可以提供各种参数来自定义文件生成:

参数 描述
name 提供一个自定义的文件名,不同于变量名
path 给出一个自定义的路径
execute 是否执行你的File(当包含在Widget树中时)
create 是否实际创建文件或不创建

示例:

@Func(
  name: 'main',
  path: 'folder',
  execute: false,
  create: true,
)
final Widget main_widget = Comment('main file');

Pack

@Pck()注解的工作方式类似于@Func()。你可以注解一个File列表变量,并生成一个表示这个Pack的Widget。

参数 描述
name 这个Pack的命名空间
main 主函数的路径
load 加载函数的路径

如果你不提供命名空间,它将选择你的变量名。

示例:

@Pck(name: 'namespace', main: 'main', load: 'load')
final List<File> myPack = [
  LoadFile,
  MainFile,
];

这将生成这样的Widget:

class NamespacePack extends Widget {
  @override
  Widget generate(Context context) => Pack(
        name: 'namespace',
        files: myPack,
        load: File('load', create: false),
        main: File('main', create: false),
      );
}

Project

最后,创建一个数据包需要一个@Prj。这可以自动生成一个主函数,包含所有必要的部分,以便实际生成所有的包和文件。

参数 描述
name 数据包的名称
version 目标Minecraft版本(作为整数)
target 生成数据包的目标目录
description 包.mcdata的描述
genMain 如果你不希望生成主函数,则设置为false(否则将生成generate_[varname]

我们仍然需要注解一个Widget变量,它是我们的Widget树的根:

@Prj(
  name: 'My awesome Datapack',
  target: './datapacks/',
  version: 17,
  description: 'A simple dp for demonstrating annotations',
)
final myProject = NamespacePack();

这将在g.dart中生成如下内容:

void main([List<String> args = const []]) => createProject(
      Project(
        name: 'My awesome Datapack',
        target: './datapacks/',
        version: 17,
        description: 'A simple dp for demonstrating annotations',
        generate: myProject,
      ),
      args,
    );

更多关于Flutter插件objd_gen的使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件objd_gen的使用方法的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


objd_gen 是一个用于自动生成 Flutter 代码的插件,通常用于简化开发流程,尤其是在处理大量重复代码或复杂逻辑时。虽然它的官方文档可能不够详尽,但通过分析和推测,我们可以探讨一些潜在的使用场景和功能。

1. 自动生成Widget代码

objd_gen 可能用于自动生成常见的 Flutter Widget 代码。例如,生成一个包含多个子 Widget 的复杂布局,或者生成具有特定样式的按钮。

// 自动生成一个包含文本和按钮的 Widget
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: [
          Text('Hello, World!'),
          ElevatedButton(
            onPressed: () {},
            child: Text('Click Me'),
          ),
        ],
      ),
    );
  }
}

2. 简化数据模型生成

在处理大量数据模型时,objd_gen 可能能够根据 JSON 或其他数据格式自动生成 Dart 数据模型类。这可以减少手动编写样板代码的工作量。

// 自动生成的数据模型类
class User {
  final String name;
  final int age;

  User({required this.name, required this.age});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      name: json['name'],
      age: json['age'],
    );
  }

  Map<String, dynamic> toJson() => {
    'name': name,
    'age': age,
  };
}

3. 状态管理代码生成

objd_gen 可能能够自动生成与状态管理相关的代码,例如生成 ProviderRiverpod 的代码片段。这可以帮助开发者快速搭建状态管理架构。

// 自动生成的 Provider 代码
class UserProvider with ChangeNotifier {
  User? _user;

  User? get user => _user;

  void setUser(User user) {
    _user = user;
    notifyListeners();
  }
}

4. 路由生成

在大型应用中,手动管理路由可能会变得复杂。objd_gen 可能能够根据项目结构自动生成路由配置,简化导航逻辑。

// 自动生成的路由配置
final Map<String, WidgetBuilder> routes = {
  '/home': (context) => HomePage(),
  '/profile': (context) => ProfilePage(),
  '/settings': (context) => SettingsPage(),
};

5. 测试代码生成

编写测试代码是开发过程中重要的一环。objd_gen 可能能够生成基本的单元测试或 Widget 测试代码,帮助开发者快速开始测试。

// 自动生成的 Widget 测试
void main() {
  testWidgets('MyWidget has a text and button', (WidgetTester tester) async {
    await tester.pumpWidget(MyWidget());

    expect(find.text('Hello, World!'), findsOneWidget);
    expect(find.byType(ElevatedButton), findsOneWidget);
  });
}

6. 国际化支持

对于多语言应用,objd_gen 可能能够自动生成国际化相关的代码,例如生成 intl 包所需的 .arb 文件和对应的 Dart 代码。

// 自动生成的国际化代码
class AppLocalizations {
  static const String helloWorld = 'Hello, World!';
  static const String clickMe = 'Click Me';
}

7. 依赖注入

在需要依赖注入的场景中,objd_gen 可能能够生成依赖注入的相关代码,例如使用 get_itinjectable 包。

// 自动生成的依赖注入代码
final getIt = GetIt.instance;

void setupLocator() {
  getIt.registerSingleton<UserProvider>(UserProvider());
}

8. 自动化构建脚本

objd_gen 还可能支持生成自动化构建脚本,例如用于生成代码或执行其他构建任务的脚本。

# 自动生成的构建脚本
flutter pub run build_runner build
回到顶部