Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
2 tasks done
ndelanou opened this issue Jan 26, 2023 · 12 comments
Open
2 tasks done
Labels
enhancement New feature or request

Comments

@ndelanou
Copy link

Is there an existing issue for this?

  • 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

  • I agree to follow this project's Code of Conduct
@ndelanou ndelanou added the enhancement New feature or request label Jan 26, 2023
@ndelanou
Copy link
Author

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
Copy link

+1 Also would like this.

@daviddrrichter
Copy link

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

@TeddyYeung
Copy link

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

@flutter-max
Copy link

any update from this issue ?!

@lcdsmao
Copy link
Member

lcdsmao commented Jul 10, 2023

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

@flutter-max
Copy link

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

#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
Copy link
Member

lcdsmao commented Jul 10, 2023

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
Copy link

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.

@lcdsmao
Copy link
Member

lcdsmao commented Jul 10, 2023

@Hadeel-Masoud
Can you try

flutter_gen:
  assets:
    outputs:
      style: camel-case

@flutter-max
Copy link

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

@TeddyYeung
Copy link

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

@Nico04 Nico04 mentioned this issue Sep 8, 2023
2 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

6 participants