FlutterGen / flutter_gen

The Flutter code generator for your assets, fonts, colors, … — Get rid of all String-based APIs.
https://pub.dev/packages/flutter_gen
MIT License
1.43k stars 142 forks source link

[FR]: Use `static const` variables instead of getters for assets when using `style: dot-delimiter` #351

Open ndelanou opened 1 year ago

ndelanou commented 1 year ago

Is there an existing issue for this?

Describe the problem

When generating assets using style: dot-delimiter, I would like to be able to access the generated assets as constant values. I found this previous issue (#185) but I would like to keep the dot-delimiter style.

Today, the generated code look like this:

SvgGenImage get icon => const SvgGenImage('assets/my-library-1/icon.svg');

So I cannot call it like this:

const icon = Assets.myLibrary1.icon;

This is preventing me from creating several const Widgets.

Describe the solution

The generated code could look like this:

static const icon = SvgGenImage('assets/my-library-1/icon.svg');

Additional context

No response

Code of Conduct

ndelanou commented 1 year ago

Tried to modify the generated code and faced instance_access_to_static_member errors when accessing the generated assets.

I don't think there is any workaround right now to access static variables through instances.

This issue can either be closed or kept as a reminder if something change with Dart in the future.

workerbee22 commented 1 year ago

+1 Also would like this.

daviddrrichter commented 1 year ago

+1 would like this. This would definitely increase the effective and clean Dart code.

TeddyYeung commented 1 year ago

+1 would like this. Otherwise, there is no choice but using asset generator plugin from IDE to use static const variables.

flutter-max commented 11 months ago

any update from this issue ?!

lcdsmao commented 11 months ago

This is impossible in the current dart. You need to take a trade-off between DX and performance. 🥲

flutter-max commented 11 months ago

This is impossible in the current dart. You need to take a trade-off between DX and performance. 🥲

https://github.com/FlutterGen/flutter_gen/issues/185

in this issue you told to put style as camel case or snack case, then static const will generated. right? i made this but also static not generated.

my second question if you know good package or extension for asset generation please tell me. thanks

lcdsmao commented 11 months ago

Please show your config. The generated code should looks like this: https://github.com/FlutterGen/flutter_gen/blob/main/packages/core/test_resources/actual_data/assets_camel_case.gen.dart

Sorry, I'm not familiar with other packages.

flutter-max commented 11 months ago

This is my yaml file:

name: cookpedia description: A new Flutter project. publish_to: 'none' version: 1.0.0+1

environment: sdk: '>=3.0.5 <4.0.0'

dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter cupertino_icons: ^1.0.2 dio: ^5.2.1+1 flutter_svg: ^2.0.7 flutter_bloc: ^8.1.3 internet_connection_checker: ^1.0.0+1 get_it: ^7.6.0 equatable: ^2.0.5 flutter_hooks: ^0.18.6 pin_code_fields: ^8.0.1

dev_dependencies: flutter_test: sdk: flutter flutter_lints: ^2.0.0 build_runner: flutter_gen_runner:

flutter_gen: assets: style: camel-case

flutter: generate: true uses-material-design: true assets:

And The generated file like this:

class $AssetsIconsGen { const $AssetsIconsGen();

/// File path: assets/icons/apple.svg String get apple => 'assets/icons/apple.svg';

/// File path: assets/icons/arabic.svg String get arabic => 'assets/icons/arabic.svg';

/// File path: assets/icons/arrow_back.svg String get arrowBack => 'assets/icons/arrow_back.svg';

/// File path: assets/icons/arrow_down.svg String get arrowDown => 'assets/icons/arrow_down.svg';

/// File path: assets/icons/calendar.svg String get calendar => 'assets/icons/calendar.svg'; }

SO It Did Not generate statics const even i put camel case in style. i dont know why.

lcdsmao commented 11 months ago

@Hadeel-Masoud Can you try

flutter_gen:
  assets:
    outputs:
      style: camel-case
flutter-max commented 11 months ago

Thanks it works! and now i can use static const instead of get .

TeddyYeung commented 11 months ago

@lcdsmao Could you take a look at my case as well? I am using (style: dot-delimiter) and (style: camel - case) both.

But it seems there is no way to put them all below

flutter_gen:
  output: lib/style/res
  assets:
    exclude:
      - assets/prompts/**/*
class $AssetsIconsGen {
  const $AssetsIconsGen();

  /// File path: assets/icons/apple_logo.svg
  String get appleLogo => 'assets/icons/apple_logo.svg';

  /// List of all assets
  List<String> get values => [
        appleLogo,
      ];
}

class $AssetsImagesGen {
  const $AssetsImagesGen();

  /// File path: assets/images/bg-grad-black-green.png
  AssetGenImage get bgGradBlackGreen =>
      const AssetGenImage('assets/images/bg-grad-black-green.png');

  /// List of all assets
  List<AssetGenImage> get values => [
        bgGradBlackGreen,
      ];
}

class Assets {
  Assets._();

  static const $AssetsIconsGen icons = $AssetsIconsGen();
  static const $AssetsImagesGen images = $AssetsImagesGen();
}