flutter_gen icon indicating copy to clipboard operation
flutter_gen copied to clipboard

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

Open ndelanou opened this issue 2 years ago • 12 comments

Is there an existing issue for this?

  • [X] I have searched the existing issues

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

  • [X] I agree to follow this project's Code of Conduct

ndelanou avatar Jan 26 '23 16:01 ndelanou

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.

ndelanou avatar Jan 26 '23 17:01 ndelanou

+1 Also would like this.

workerbee22 avatar Jan 27 '23 09:01 workerbee22

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

daviddrrichter avatar Jan 29 '23 17:01 daviddrrichter

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

TeddyYeung avatar Apr 16 '23 06:04 TeddyYeung

any update from this issue ?!

flutter-max avatar Jul 10 '23 01:07 flutter-max

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

lcdsmao avatar Jul 10 '23 02:07 lcdsmao

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

flutter-max avatar Jul 10 '23 02:07 flutter-max

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.

lcdsmao avatar Jul 10 '23 02:07 lcdsmao

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: - assets/images/ - assets/gif/ - assets/icons/ - assets/json/

fonts: - family: Urbanist fonts: - asset: assets/fonts/Urbanist-Regular.ttf weight: 400 - asset: assets/fonts/Urbanist-Medium.ttf weight: 500 - asset: assets/fonts/Urbanist-SemiBold.ttf weight: 600 - asset: assets/fonts/Urbanist-Bold.ttf weight: 700

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.

flutter-max avatar Jul 10 '23 10:07 flutter-max

@Hadeel-Masoud Can you try

flutter_gen:
  assets:
    outputs:
      style: camel-case

lcdsmao avatar Jul 10 '23 10:07 lcdsmao

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

flutter-max avatar Jul 10 '23 10:07 flutter-max

@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();
}

TeddyYeung avatar Jul 11 '23 09:07 TeddyYeung