Flutter Google Sheet localizations generator

Overview

Flutter Google Sheet localizations generator

Generates a localizations delegate from an online Google Sheet file.

Install

Add the following to your pubspec.yaml:

dependencies:
  flutter_sheet_localization: <latest>
  flutter_localizations:
    sdk: flutter

dev_dependencies:
  flutter_sheet_localization_generator: <latest>
  build_runner: <latest>

Usage

1. Create a Google Sheet

Create a sheet with your translations (following the bellow format, an example sheet is available here) :

example

Make sure that your sheet is shared :

share

Extract from the link the DOCID and SHEETID values : https://docs.google.com/spreadsheets/d//edit#gid=) :

2. Declare a localization delegate

Declare the following AppLocalizationsDelegate class with the SheetLocalization annotation pointing to your sheet in a lib/localization.dart file :

{ const AppLocalizationsDelegate(); @override bool isSupported(Locale locale) => localizedLabels.containsKey(locale); @override Future load(Locale locale) => SynchronousFuture(localizedLabels[locale]!); @override bool shouldReload(AppLocalizationsDelegate old) => false; } ">
import 'package:flutter/widgets.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_sheet_localization/flutter_sheet_localization.dart';

part 'localization.g.dart';

@SheetLocalization("DOCID", "SHEETID", 1) // <- See 1. to get DOCID and SHEETID
// the `1` is the generated version. You must increment it each time you want to regenerate
// a new version of the labels.
class AppLocalizationsDelegate
    extends LocalizationsDelegate<AppLocalizationsData> {
  const AppLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) => localizedLabels.containsKey(locale);

  @override
  Future<AppLocalizationsData> load(Locale locale) =>
      SynchronousFuture<AppLocalizationsData>(localizedLabels[locale]!);
  @override
  bool shouldReload(AppLocalizationsDelegate old) => false;
}

3. Generate your localizations

Run the following command to generate a lib/localization.g.dart file :

flutter packages pub run build_runner build

4. Configure your app

Update your Flutter app with your newly created delegate :

MaterialApp(
    locale: AppLocalizations.languages.keys.first, // <- Current locale
    localizationsDelegates: [
    const AppLocalizationsDelegate(), // <- Your custom delegate
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    ],
    supportedLocales:
        AppLocalizations.languages.keys.toList(), // <- Supported locales
    // ...
);

5. Display your labels

final labels = AppLocalizations.of(context);
print(labels.dates.month.february);
print(labels.templated.hello(firstName: "World"));
print(labels.templated.contact(Gender.male, lastName: "John"));

Regeneration

Because of the caching system of the build_runner, it can't detect if there is a change on the distant sheet and it can't know if a new generation is needed.

The version parameter of the @SheetLocalization annotation solves this issue.

Each time you want to trigger a new generation, simply increment that version number and call the build runner again.

Google Sheet format

You can see an example sheet here.

Global format

The file should have :

  • A first header row
    • Column 0 : "Key"
    • then each supported language code ("en", "fr", ...)
  • Following rows for labels
    • Column 0 : the label key (can be a hierarchy, separated by dots)
    • then each translation based on language code of the column

Ignoring a column

Sometimes you may need to add comments for translators. For this, simply add a column with a name between parenthesis and the column will be completely ignored by the generator.

Example :

Key (Comments) fr en
example.man(Gender.male) This is a man title on home page homme man
example.man(Gender.female) This is a woman title on home page femme woman

Conditionals

It is pretty common to have variants of a label based on a condition (for example: Genders, Plurals, ...).

Simply duplicate your entries and end them with (..

Example :

Key fr en
example.man(Gender.male) homme man
example.man(Gender.female) femme woman

See example for more details.

Plurals

The conditionals can be used the same way for plurals :

Example :

Key fr en
example.man(Plural.zero) hommes man
example.man(Plural.one) homme man
example.man(Plural.multiple) hommes men

From your Dart code, you can then define an extension :

extension PluralExtension on int {
  Plural plural() {
    if (this == 0) return Plural.zero;
    if (this == 1) return Plural.one;
    return Plural.multiple;
  }
}

See example for more details.

Dynamic labels

You can insert a {{KEY}} template into a translation value to have dynamic labels.

A Dart function will be generated to be used from your code.

/// Sheet
values.hello, "Hello {{first_name}}!"

/// Code
print(labels.values.hello(firstName: "World"));

Typed parameters

You can also add one of the compatible types (int, double, num, DateTime) to the parameter by suffixing its key with :.

/// Sheet
values.price, "The price is {{price:double}}\$"

/// Code
print(labels.values.price(price: 10.5));

Formatted parameters

You can indicate how the templated value must be formatted by ending the value with a formatting rule in brackets []. This can be particulary useful for typed parameters.

The available formatting rules depend on the type and generally rely on the intl package.

Type rule-key Generated code
double, int, num decimalPercentPattern, currency, simpleCurrency, compact, compactLong, compactSimpleCurrency, compactCurrency, decimalPattern, percentPattern, scientificPattern NumberFormat.(...)
DateTime Any date format valid pattern DateFormat('', ...).format(...)

Examples:

/// Sheet
values.price, "Price : {{price:double[compactCurrency]}}"

/// Code
print(labels.values.price(price: 2.00));
/// Sheet
values.today, "Today : {{date:DateTime[EEE, M/d/y]}}"

/// Code
print(labels.values.today(date: DateTime.now()));

Why ?

I find the Flutter internationalization tools not really easy to use, and I wanted a simple tool for sharing translations. Most solutions also use string based keys, and I wanted to generate pure dart code to improve permormance.

Comments
  • flutter_sheet_localization_generator is not supporting intl ^0.17.0

    flutter_sheet_localization_generator is not supporting intl ^0.17.0

    Please update package to support latest version of flutter.

    Because flutter_sheet_localization_generator >=2.0.0 depends on intl ^0.16.1 and my_project depends on intl ^0.17.0, flutter_sheet_localization_generator >=2.0.0 is forbidden.
    
    So, because my_project depends on flutter_sheet_localization_generator ^2.1.2, version solving failed.
    pub get failed (1; So, because my_project depends on flutter_sheet_localization_generator ^2.1.2, version solving failed.)
    
    opened by uc-dve 5
  • Missing Chinese languages support

    Missing Chinese languages support

    Hi, thanks for great tool! Can you add support for Chinese languages?

    supportedLocales: [ const Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans'), // generic simplified Chinese 'zh_Hans' const Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hant'), // generic traditional Chinese 'zh_Hant' ],

    enhancement good first issue 
    opened by denis-stepushchik 5
  • After upgrading to NNBD 3.0.0

    After upgrading to NNBD 3.0.0

    After upgrading package to NNBD 3.0.0

    I'm seeing the following errors

    lib/localization.g.dart:47:13: Error: The parameter 'settings' can't have a value of 'null' because of its type 'String', but the implicit default value is 'null'.
        Try adding either an explicit non-'null' default value or the 'required' modifier.
    

    Is it because flutter_sheet_localization_generator still not migrated to NNBD?

    duplicate 
    opened by salehahmedZ 4
  • Can not install package

    Can not install package

    Hi,

    I am trying to install the package (as defined in README) but unfortunately i keep getting those errors:

    dart --version Dart SDK version: 2.9.0 (stable) (Fri Jul 31 10:59:48 2020 +0200) on "linux_x64"

    flutter --version Flutter 1.20.1 • channel stable • https://github.com/flutter/flutter.git Framework • revision 2ae34518b8 (6 days ago) • 2020-08-05 19:53:19 -0700 Engine • revision c8e3b94853 Tools • Dart 2.9.0

    flutter doctor
    Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 1.20.1, on Linux, locale en_US.UTF-8)

    [✓] Android toolchain - develop for Android devices (Android SDK version 30.0.1) [✓] Android Studio (version 4.0) [✓] VS Code (version 1.47.3) [✓] Connected device (1 available)

    • No issues found!

    flutter packages pub run build_runner build Precompiling executable... Precompiled build_runner:build_runner. [INFO] Generating build script... [INFO] Generating build script completed, took 283ms

    [WARNING] Deleted previous snapshot due to missing asset graph. [INFO] Creating build script snapshot...... [INFO] Creating build script snapshot... completed, took 10.5s

    [INFO] Initializing inputs [INFO] Building new asset graph... [INFO] Building new asset graph completed, took 649ms

    [INFO] Checking for unexpected pre-existing outputs.... [INFO] Checking for unexpected pre-existing outputs. completed, took 1ms

    [INFO] Running build... [INFO] Generating SDK summary... [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    Bad state: Unexpected diagnostics: /mnt/sdb/Android/flutter/bin/cache/dart-sdk/lib/core/uri.dart:3259:39 - Expected an identifier. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/app/controller/home_controller.dart:

    bug 
    opened by Jojoooo1 4
  • What's the problem for

    What's the problem for "RangeError (index): Invalid value: Valid value range is empty: 0"

    Hi, Thanks for you sharing a so Powerful tools. that's great. But when i first use, it report the following error. I have retry Several times, but no luck. I can't found the tool source in .drat_tool folder to trace the issue. Could u give me an idea? thank you very much.

    [INFO] 4.2s elapsed, 1/12 actions completed. [INFO] 5.3s elapsed, 1/12 actions completed. [INFO] 6.5s elapsed, 1/12 actions completed. [INFO] flutter_sheet_localization_generator:flutter_sheet_localization on lib/localizations.dart:Downloading csv from Google sheet url "https://docs.google.com/spreadsheets/d/XXX/export?format=csv&id=XXX&gid=0" ... [INFO] 12.9s elapsed, 3/12 actions completed. [SEVERE] flutter_sheet_localization_generator:flutter_sheet_localization on lib/localizations.dart: Error running SheetLocalizationGenerator RangeError (index): Invalid value: Valid value range is empty: 0 [INFO] Running build completed, took 13.8s

    [INFO] Caching finalized dependency graph... [INFO] Caching finalized dependency graph completed, took 42ms

    [SEVERE] Failed after 13.8s pub finished with exit code 1

    opened by debugerer 4
  • Comment out columns

    Comment out columns

    Hey there, your package relay helped us to make fast progress in internationalization of our app. What I really like is the possibility to just share the sheet and give it to someone else for translation. But what I'm missing is the possibility to have columns with custom data like description or further information for the translators. As well, I could imagine that it could be a cool feature to "comment out" columns to just remove that language in the next build. So, what is suggesting is to add a "comment out prefix". If the label of the column starts with that (for example //) the parser ignores that column. In that case, you can add as many custom columns as you want and remove languages temporary without any trouble. Would love to see that feature in the package. Are pull request welcome? If so, do you have any hint where to start? I think we could just remove the comment out columns from fields?

    enhancement 
    opened by guenth39 3
  • Undefined name

    Undefined name

    I'm going through and trying to implement this for the first time. I think I've got everything in place, but I get this message:

    image

    Can you explain what's going on, and offer a suggestion for how to resolve this?

    question 
    opened by hanskokx 3
  • Dart Analyzer gives me warnings

    Dart Analyzer gives me warnings

    Hi,

    I just started to using this plugin. But Dart Analyzer give me Name types using UpperCamelCase. error as you know effective dart style "UpperCamelCase names capitalize the first letter of each word, including the first."

    https://dart.dev/guides/language/effective-dart/style

    when you create classes the classes name must be combined.

    Below example give me error.

    class AppLocalizations_Labels_App_Name {
      const AppLocalizations_Labels_App_Name({this.long, this.short});
      final String long;
      final String short;
    }
    

    Should be like below.

    class AppLocalizationsLabelsAppName {
      const AppLocalizationsLabelsAppName({this.long, this.short});
      final String long;
      final String short;
    }
    
    enhancement 
    opened by kalismeras61 3
  • [WARNING] ... Missing

    [WARNING] ... Missing "part 'localization.g.dart On MacOS Catalina (v10.15)

    $ flutter packages pub run build_runner build [INFO] Generating build script... [INFO] Generating build script completed, took 509ms

    [INFO] Initializing inputs [INFO] Reading cached asset graph... [INFO] Reading cached asset graph completed, took 118ms

    [INFO] Checking for updates since last build... [INFO] Checking for updates since last build completed, took 1.5s

    [WARNING] glob|lib/src/io.dart was not found in the asset graph, incremental builds will not work. This probably means you don't have your dependencies specified fully in your pubspec.yaml. [WARNING] Invalidating asset graph due to build script update! [INFO] Cleaning up outputs from previous builds.... [INFO] Cleaning up outputs from previous builds. completed, took 6ms

    [INFO] Generating build script... [INFO] Generating build script completed, took 116ms

    [INFO] Creating build script snapshot...... [INFO] Creating build script snapshot... completed, took 16.8s

    [INFO] Initializing inputs [INFO] Building new asset graph... [INFO] Building new asset graph completed, took 963ms

    [INFO] Checking for unexpected pre-existing outputs.... [INFO] Checking for unexpected pre-existing outputs. completed, took 2ms

    [INFO] Running build... [INFO] 1.2s elapsed, 1/16 actions completed. [INFO] 2.3s elapsed, 6/22 actions completed. [INFO] 3.4s elapsed, 6/22 actions completed. [INFO] 4.8s elapsed, 8/24 actions completed. [INFO] 5.9s elapsed, 11/27 actions completed. [INFO] 9.8s elapsed, 11/27 actions completed. [INFO] 14.6s elapsed, 17/32 actions completed. [INFO] 15.6s elapsed, 27/40 actions completed. [INFO] 16.9s elapsed, 40/42 actions completed. [INFO] flutter_sheet_localization_generator:flutter_sheet_localization on lib/localization.dart:Downloading csv from Google sheet url "https://docs.google.com/spreadsheets/d/1TbuY592UMurrS2kmrW8GVPmHFGqnZ-SILtAZ7Hre10Y/export?format=csv&id=1TbuY592UMurrS2kmrW8GVPmHFGqnZ-SILtAZ7Hre10Y&gid=0" ... [INFO] 18.0s elapsed, 41/42 actions completed. [WARNING] flutter_sheet_localization_generator:flutter_sheet_localization on lib/localization.dart: Missing "part 'localization.g.dart';". [INFO] Running build completed, took 18.4s

    [INFO] Caching finalized dependency graph... [INFO] Caching finalized dependency graph completed, took 119ms

    [INFO] Succeeded after 18.5s with 0 outputs (84 actions)

    bug 
    opened by spouletmathis 3
  • google translate the google sheet ?

    google translate the google sheet ?

    see mine: https://docs.google.com/spreadsheets/d/16eeYgh8dus50fISokKK8TMVWLR8A18Er-p5dBcO0FYw/edit#gid=0

    The De column is machine translated.

    But i am not sure how to turn the values into real values... And hence remove the "=GOOGLETRANSLATE(C2,"en","de")"

    any ideas ?

    opened by winwisely99 3
  • put a column on whitelist for parsing

    put a column on whitelist for parsing

    hey @aloisdeniel, I really like your work with this package. I'd have one suggestion: For better comprehensibility I'd love to add a group column in the google sheet. For example to group the keys by on which page they appear in my app. Of course you can just name your key '<pageName>.<key>', nonetheless I think this would be a nice feature to just say somewhere that a specific column name should not be added as a language (same as the condition-column). Especially if you want to give the job to translate your app to someone without good it-skills it may be hard for them to read the sheet. Thanks 😄

    enhancement 
    opened by ArturAntin 2
  • How to identify unused items

    How to identify unused items

    Over time we got a lot of translations.

    Now we have some removed from sourcecode but they are still in the translation sheet.

    Is there an easy way to find out which translations are in use to remove unused ones from the sheet?

    opened by bobatsar 0
  • Can't use dynamic labels together with pluralization

    Can't use dynamic labels together with pluralization

    Dynamic labels in a plural value are not replaced. If i have the below definitions then {{count}} will not be expanded in the second translation.

    key: selected(Plural.one)
    en: 1 item selected 
    
    key: selected(Plural.multiple)
    en: {{count}} items selected
    

    Not mentioned in the docs so unsure whether a bug or just not yet implemented.

    opened by marcjoha 1
Owner
Aloïs Deniel
Flutter Freelance
Aloïs Deniel
Environment specific config generator for Dart and Flutter applications during CI/CD builds

Environment Config Generator Environment specific config generator. Allows to specify env configuration during CI/CD build. Primarily created to simpl

Denis Beketsky 86 Dec 2, 2022
The Flutter code generator for your assets, fonts, colors, … — Get rid of all String-based APIs.

The Flutter code generator for your assets, fonts, colors, … — Get rid of all String-based APIs. Inspired by SwiftGen. Motivation Using asset path str

FlutterGen 1.1k Jan 6, 2023
🚀The Flutter dart code generator from zeplin. ex) Container, Text, Color, TextStyle, ... - Save your time.

Flutter Gen Zeplin Extension ?? The Flutter dart code generator from zeplin. ex) Container, Text, Color, TextStyle, ... - Save your time. ⬇ 1.1k Getti

NAVER 49 Oct 12, 2022
A Flutter curl-command generator for Dio

curl_logger_dio_interceptor A Flutter curl-command generator for Dio. Easily test your Flutter-made requests in your favorite terminal or even in Post

null 7 Nov 17, 2022
OpenAPI generator for Dart & Flutter

Fantom Fantom is a cli tool for generating API layer based on OpenAPI Spec. Usage Install fantom $ dart pub global activate fantom Generate API client

6thSolution 13 Oct 18, 2022
OpenAPI generator for Dart & Flutter

Fantom Fantom is a cli tool for generating API layer based on OpenAPI Spec. Usage Install fantom $ dart pub global activate fantom Generate API client

REKAB 13 Oct 18, 2022
Flutter Word generator

wordpair_generator A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you start

Aristide Sabi 0 Dec 3, 2021
Random color generator for Flutter

Random color generator Pub link: https://pub.dartlang.org/packages/random_color This library will generate random colors that are visually pleasing an

Luka Knezic 56 Jun 13, 2022
A Flutter Word generator App to improve English vocabulary

Word generator App to improve English vocabulary: Add English words you don't know and their translation, then you need to answer what is the translat

Gustavo Bonassa 1 Dec 12, 2021
Swagger/OpenAPI code generator based on Chopper and JsonAnnotation for Flutter

Code partially generated with chopper ?? Build dart types from Swagger/OpenAPI schemas SwaggerDartCodeGenerator is a code generator that looks for *.s

null 187 Jan 5, 2023
A certificate generator app developed in Flutter with love.

Holden Certificate Generator made with Flutter. Dependencies spreadsheet_decoder path_provider file_picker pdf_viewer_plugin pdf permission_handler sh

null 20 Jan 4, 2023
Destiny is a new, mock-data generator for Dart/Flutter

Destiny is a new, mock-data generator for Dart/Flutter. It uses static methods couched in a destiny namespace as the API.

Aditya Kishore 11 Sep 16, 2022
GPT-3 recipe generator for the GPT-3 Makeathon by TUM.AI. Developed by team Taste the data.

GPT-3 Makeathon by TUM.AI - Team: Taste the Data Team - Taste the Data: Carmen Heger <@stedomedo> David Stiftl <@stiftlD> Christopher Schütz <@cdschtz

Oliver Klukas 11 Dec 4, 2022
Dart Code Generator for generating mapper classes

Smartstruct - Dart bean mappings - the easy nullsafe way! Code generator for generating type-safe mappers in dart, inspired by https://mapstruct.org/

Nils 28 Nov 29, 2022
A generator to create config class from json files that support many environments

A generator to create config class from json files that support many environments. Motivation If you use a json file to config your applications, perp

Diego Cardenas 0 Oct 9, 2021
The Dart code generator for your package versions. 🎯

The Dart code generator for your package versions. There is no way to get the package version from the code in the Dart ecosystem. Installation Add bu

Daichi Furiya 12 Dec 14, 2022
Provide route generator to create route map quickly by annotations.

ff_annotation_route Languages: English | 中文简体 Description Provide a route generator to create route map quickly by annotations. ff_annotation_route De

FlutterCandies 113 Nov 25, 2022
VS Code `.code-workspace` file generator

VS Code .code-workspace file generator (for monorepositories with Dart and Flutter projects) TL;DR; Create yaml file config.yaml (check #Format sectio

Mike T 1 Feb 18, 2022