Extentions for dart

Overview

What New

  • Responsive UI tools 💪🏻💪🏻💪🏻
  • flatJson -> Flatten a nested Map into a single level map
  • Iterables -> all -> Returns true if all elements match the given
  • isVideo - Checks if string is an video file.
  • isAudio - Checks if string is an audio file.
  • isImage - Checks if string is an image file.
  • isNumericOnly - Check if the string has any number in it.
  • isAlphabetOnly - Checks if string consist only Alphabet. (No Whitespace)
  • hasCapitalletter - Checks if string contains at least one Capital Letter.
  • isHTML - Checks if string is an html file.
  • isEmail - Checks if string is email..
  • isPhoneNumber - Checks if string is phone number, good for login checks.
  • isUsername - Checks if string is a valid username, good for login checks.
  • isCurrency - Checks if string is Currency.
  • isPalindrom - Checks if string is Palindrome. (good to know for interviews

as well) Why Method Extensions? When you’re using someone else’s API or when you implement a library that’s widely used, it’s often impractical or impossible to change the API. But you might still want to add some functionality.

let me know if you want something specific or you found a bug at [email protected]

Let get started 💪🏻

  1. Go to pubspec.yaml
  2. add a dart_extensions and replace [version] with the latest version:
dependencies:  
 dart_extensions: ^[version]
  1. click the packages get button or flutter pub get

Responsive UI

Very common way to calculate size in percentage is using the MediaQuery like so:

MediaQuery.of(context).size.width * 0.1

Flatten a nested Map into a single level map

response.flatJson({
  'key1': {'keyA': 'valueI'},
  'key2': {'keyB': 'valueII'},
  'key3': {
    'a': {
      'b': {'c': 2}
    }
  }
});

The result you can also specify max depth, its the maximum number of nested objects to flatten.

// { // 'key1.keyA': 'valueI', // 'key2.keyB': 'valueII', // 'key3.a.b.c': 2 // };

Instead of the boilerplate we can use this awesome extension and get the same results.

Wrap your Application with:

ResponsiveApp(
      builder: (BuildContext context, Orientation orientation, DeviceType deviceType) {
        return YourAppWidget()
)
AnimatedList(
              key: chatListKey,
              reverse: true,
              padding: EdgeInsets.only(top: 10.textSizeResponsive),
              shrinkWrap: true,

Also the text should be responsive, no problem

Text(
  'Note added by ${message.from ?? ''}',
  style: avanirBook.copyWith(fontSize: 8.responsiveText),
),

Iterable Extensions

.any()

Returns true if at least one element matches the given predicate.

u.name == 'Kasey') // true">
final users = [User(22, "Kasey"), User(23, "Jadn")]; 
users.any((u) => u.name == 'Kasey') // true

.groupBy()

Groups the elements in values by the value returned by key.

u.age); ">
final users = [User(22, "Kasey"), User(23, "Jadn"), User(22, "Rene"), User(32, "Aden")]; 

users.groupBy((u) => u.age); 

Sort the users by age:

{  
  22: [User:22, Kasey, User:22, Rene], 
  23: [User:23, Jadn], 
  32: [User:32, Aden]
}

.sortBy()

Sorts elements in the array in-place according to natural sort order of the value returned by specified selector function.

u.age) /// [User(16, "Roni"), [User(22, "Kasey"), User(23, "Jadn")]">
final users = [User(22, "Kasey"), User(16, "Roni"), User(23, "Jadn")]; 
users.sortBy((u) => u.age) ///  [User(16, "Roni"), [User(22, "Kasey"), User(23, "Jadn")]

.find()

Returns the first element matching the given predicate, or null if element wasn't found.

u.name == "Rene") // User(22, "Rene")">
final users = [User(22, "Kasey"), User(23, "Jadn"), User(22, "Rene"), User(32, "Aden")]; 

users.find((u) => u.name == "Rene") // User(22, "Rene")

.chunks()

Splits the Iterable into chunks of the specified size

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].chunks(3)) 

result

([1, 2, 3], [4, 5, 6], [7, 8, 9], [10])

.filter()

Returns a list containing only elements matching the given predicate, the return type will be List, unlike the where operator that return Iterator, also it filters null.

u.name == "Kasey"); // [User(22, "Kasey")] <- Type List final listWithNull = [null, User(23, "Jadn"), User(22, "Rene"), User(32, "Aden")]; final filtered = listWithNull.filter((u) => u.name == "Jadn"); // [User(23, "Jadn")]">
final users = [User(22, "Kasey"), User(23, "Jadn"), User(22, "Rene"), User(32, "Aden")]; 
final filtered = users.filter((u) => u.name == "Kasey"); // [User(22, "Kasey")] <- Type List

final listWithNull = [null, User(23, "Jadn"), User(22, "Rene"), User(32, "Aden")];
final filtered = listWithNull.filter((u) => u.name == "Jadn"); // [User(23, "Jadn")]

.intersect()

Returns a set containing all elements that are contained by both this set and the specified collection.

Set.from([1, 2, 3, 4]).intersect(Set.from([3, 4, 5, 6]) // 1,2,3,4,5,6

.filterNot()

Returns a list containing only not the elements matching the given predicate, the return type will be List, unlike the where operator that return Iterator, also it filters null.

u.name == "Kasey"); // [User(23, "Jadn"), User(22, "Rene"), User(32, "Aden")] <- Type List final listWithNull = [null, User(23, "Jadn"), User(22, "Rene"), User(32, "Aden")]; final filtered = listWithNull.filterNot((u) => u.name == "Jadn"); // [User(22, "Rene"), User(32, "Aden")]">
final users = [User(22, "Kasey"), User(23, "Jadn"), User(22, "Rene"), User(32, "Aden")]; 
final filtered = users.filterNot((u) => u.name == "Kasey"); // [User(23, "Jadn"), User(22, "Rene"), User(32, "Aden")] <- Type List

final listWithNull = [null, User(23, "Jadn"), User(22, "Rene"), User(32, "Aden")];
final filtered = listWithNull.filterNot((u) => u.name == "Jadn"); // [User(22, "Rene"), User(32, "Aden")]

.takeOnly()

Returns a list containing first [n] elements.

[1, 2, 3, 4].takeOnly(1) // [1]

.drop()

Returns a list containing all elements except first [n] elements.

[1, 2, 3, 4].drop(1) // [2, 3, 4]

.forEachIndexed()

Performs the given action on each element on iterable, providing sequential index with the element.

["red","green","blue"].forEachIndexed((item, index) { 
	print("$item, $index"); 
}); // 0: red // 1: green // 2: blue```  

.sortedDescending()

Returns a new list with all elements sorted according to descending natural sort order.

var list = [1,2,3,4,5];  
final descendingList = list.sortedDescending();  
print(descendingList); // [5, 4, 3, 2, 1]

.count()

Return a number of the existing elements by a specific predicate

user.age > 20); print(aboveAgeTwenty); // 2">
final users = [User(33, "Miki"), User(45, "Anna"), User(19, "Amit")];  
  
final aboveAgeTwenty = users.count((user) => user.age > 20);  
print(aboveAgeTwenty); // 2

.associate()

Creates a Map instance in which the keys and values are computed from the iterable.

k.name, (e) => e.age) // 'Miki': 33, 'Anna': 45, 'Amit': 19}">
final users = [User(33, "Miki"), User(45, "Anna"), User(19, "Amit")];  

users.associate((k) => k.name, (e) => e.age) // 'Miki': 33, 'Anna': 45, 'Amit': 19}

.concatWithMultipleList()

Return a list concatenates the output of the current list and multiple iterables.

  final listOfLists = [
        [5, 6, 7],
        [8, 9, 10]
      ];
  [1, 2, 3, 4].concatWithMultipleList(listOfLists); 
  
  // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

.distinctBy()

Returns a list containing only the elements from given collection having distinct keys.

u.toLowerCase().startsWith("z")); // Zack // example 2 final users = [User(11, 'idan'), User(12, 'ronit'), User(11, 'asaf')]; final dist = users.distinctBy((u) => u.age); dist.forEach((u) => print(u.age)); // 11, 12">
// example 1
final users = ["Zack", "Ian", "Ronit"];  
users.distinctBy((u) => u.toLowerCase().startsWith("z")); // Zack 

// example 2
final users = [User(11, 'idan'), User(12, 'ronit'), User(11, 'asaf')];
	
final dist = users.distinctBy((u) => u.age);    
dist.forEach((u) => print(u.age)); //  11, 12

.zip()

Zip is used to combine multiple iterables into a single list that contains the combination of them two.

final soldThisMonth = [Motorcycle(2020, 'BMW R1200GS'), Motorcycle(1967, 'Honda GoldWing')];
final soldLastMonth = [Motorcycle(2014, 'Honda Transalp'), Motorcycle(2019, 'Ducati Multistrada')];    
  
final sales = soldThisMonth.zip(soldLastMonth).toList();  
  				
print(sales); // [
  [brand: BMW R1200GS year: 2020, brand: Honda Transalp year: 2014], // first pair from this month and last
  [brand: Honda GoldWing year: 1967, brand: Ducati Multistrada year: 2019] // second pair from last month 
]

See iterable.dart for more examples.

Flutter Extensions

Context extensions

Are you not tired from typing MediaQuery.of(context).size... to get height or width? here's a cool extension

  context.mq  // returns the MediaQuery
  context isLandscape // returns if Orientation is landscape
context.sizePx // returns same as MediaQuery.of(context).size
context.widthPx // returns same as MediaQuery.of(context).size.width
context.heightPx // returns same as MediaQuery.of(context).height

Text Extensions

final text = Text('hello')
     .bold()
     .fontSize(25)
     .italic();

List Extensions

    final someWidgetList = [
      Text('hello'),
      Text('world'),
    ].toColumnWidget();  // toRowWidget(), toStackWidget()

Widget extensions

So now we can just add round corners, shadows, align, and added gestures to our Widgets without the crazy water-fall effect. awesome! That's just the tip of the iceberg, expect to see very cool stuff soon.

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Stack(
          children: <Widget>[
            Container(
              height: 100,
              width: 100,
            )   .withRoundCorners(backgroundColor: Colors.grey)
                .withShadow()
                .alignAtCenter()
                .toCenter()
                .withTooltip('just a tooltip')
                .paddingOnly(left: 10)
                .paddingAll(20)
                .onTap(() => print('tap'))
                .onLongPress(() => print('long press'))
          ],
        ),
      ),
    );
  }
}

Navigation

We can navigate from every widget by calling these methods

    navigateTo(route: MaterialPageRoute(builder: (c) => Login()));
    navigateByRouteName(Routes.home, );
    final result = navigateBack();

Http Extensions

.httpGet()

Sends an HTTP GET request with the given headers to the given URL

final json = await "https://jsonplaceholder.typicode.com/posts".httpGet();

result:

[
  {
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere",
    "body": "quia et suscipit"
  },
  {
    "userId": 1,
    "id": 2,
    "title": "qui est esse",
    "body": "dolor beatae ea dolores neque"
  },
]

usage with then:

print(e));">
"https://jsonplaceholder.typicode.com/posts".httpGet().then((result) {
          print(result);
       }).catchError((e) => print(e));

.httpPost()

Sends an HTTP POST request with the given headers and body to the given URL which can be a [Uri] or a [String].

String json = '{"title": "Hello", "body": "body text", "userId": 1}';
final json = await "https://jsonplaceholder.typicode.com/posts".httpPost(json);

for more examples (put, delete) See http.dart

Range Extensions

.until()

Returns a sequence of integer, starting from the current number until the [end] number. [step] is optional, it will step number if given

for(final num in 1.until(10)) {
  numbers.add(num); 
}

result

[1, 2, 3, 4, 5, 6, 7, 8, 9]

with step:

for(final num in 1.until(10, step: 2)) {
  numbers.add(num); 
}

result

[1, 3, 5, 7, 9]

String Extensions

.asBool()

Returns true if this string is any of these values: "true", "yes", "1", or if the string is a number and greater than 0, false if less than 1. This is also case insensitive.

'true'.asBool  // true
'True'.asBool  // true
'false'.asBool //  false
'False'.asBool //  false
'yes'.asBool   // true
'YES'.asBool   // true
'no'.asBool    // false
'NO'.asBool    // false

.insert()

Returns a new string in which a specified string is inserted at a specified index position in this instance.

'test'.insert(1, 't') // 'ttest'
'123456890'.insert(6, '7') // '1234567890'
'dart cool'.insert(4, ' is') // 'dart is cool'

.isNullOrWhiteSpace()

Indicates whether a specified string is null, empty, or consists only of white-space characters.

'test'.isNullOrWhiteSpace // false
'   '.isNullOrWhiteSpace, // true
null.isNullOrWhiteSpace, // true
'  te  st  '.isNullOrWhiteSpace // false

.replaceAfter()

Replace part of string after the first occurrence of given delimiter.

print("myemail@".replaceAfter("@", "gmail.com")); // [email protected] 

.replaceBefore()

Replace part of string before the first occurrence of given delimiter.

print('@domain.com'.replaceBefore('@', "name")); // "[email protected]"

.anyChar()

Returns true if at least one element matches the given predicate

'test'.anyChar((c) => c == 't'); // true;
'test'.anyChar((c) => c == 'd'); // false;

.ifEmpty()

If the string is empty perform an action.

print("do any action here")); // do any action here">
"".ifEmpty(() => print("do any action here")); // do any action here

.toDoubleOrNull()

Parses the string as an integer or returns null if it is not a number.

var number = '12345'.toDoubleOrNull(); // 12345  
var notANumber = '123-45'.toDoubleOrNull(); // null  

.limitFromEnd()

Limit the string to a maximum length, taking from the end of the string.

var longString = "0123456789";
var noMoreThanThree = longString.limitFromEnd(3); // "789"

.limitFromStart()

Limit the string to a maximum length, taking from the start of the string.

var longString = "0123456789";
var noMoreThanThree = longString.limitFromStart(3); // "012"

int Extensions

.inRangeOf()

Return the min if this number is smaller then minimum Return the max if this number is bigger the the maximum Return this number if it's between the range

1.inRangeOf(0, 3) // 1 number in range so will return the number
2.inRangeOf(3, 4) // 3 number is smaller then the range so will return min
5.inRangeOf(3, 4) // 4 number is bigger then the range so will return max

Flutter Extensions Full List

Flutter

  • Tooltip
  • algin
  • center
  • container
  • padding
  • navigation
  • Context
  • Text
  • List
  • Icon

Http Extensions

  • httpGet
  • httpPost
  • httpPut
  • httpDelete

Iterables Extensions

  • sortBy
  • toMutableSet
  • intersect
  • groupBy
  • find
  • filter
  • filterNot
  • isEmptyOrNull
  • chunks
  • zip
  • half
  • takeOnly
  • drop
  • firstHalf
  • secondHalf
  • swap
  • getRandom
  • firstOrNull
  • firstOrNullWhere
  • firstOrDefault
  • lastOrNull
  • lastOrDefault
  • forEachIndexed
  • sortedDescending
  • containsAll
  • count
  • distinctBy
  • subtract
  • concatWithSingleList
  • concatWithMultipleList
  • associate

Range Extensions

  • until

Strings Extensions

  • validateEmail
  • removeSurrounding
  • isNullOrEmpty
  • replaceAfter
  • replaceBefore
  • orEmpty
  • ifEmpty
  • lastIndex
  • printThis
  • equalsIgnoreCase
  • toDoubleOrNull
  • toIntOrNull
  • anyChar
  • removeAllWhiteSpace
  • isNotBlank
  • toCharArray
  • insert
  • isNullOrWhiteSpace
  • asBool

DateTime Extensions

  • toMilliseconds
  • toSeconds
  • toMinutes
  • toHours
  • toDays
  • isToday
  • addOrRemoveYears
  • addOrRemoveMonth
  • addOrRemoveDay
  • addOrRemoveMinutes
  • addOrRemoveSeconds
  • startOfDay
  • startOfMonth
  • startOfYear
  • operator to add dates
  • operator to subtract dates
  • tomorrow
  • yesterday
  • min
  • max
  • isLeapYear
  • limitFromEnd
  • limitFromStart

Integers Extensions

  • inRangeOf
  • absolute
  • isEven
  • isOdd
  • isPositive
  • isNegative
  • tenth
  • fourth
  • third
  • half
  • doubled
  • tripled
  • quadrupled
  • squared
  • asBool

Contributing

If you have read up till here, then 🎉 🎉 🎉 . There are couple of ways in which you can contribute to the growing community of dart_extensions.dart.

  • Propose any feature, enhancement
  • Report a bug
  • Fix a bug
  • Participate in a discussion and help in decision making
  • Write and improve some documentation. Documentation is super critical and its importance cannot be overstated!
  • Send in a Pull Request :-)

Contributors


Idan Ayalon

💻 📖 👀

Xamantra

💻 📖 👀

License

Copyright 2020 Idan Ayalon
  
Licensed under the Apache License, Version 2.0 (the "License");  
you may not use this file except in compliance with the License.  
You may obtain a copy of the License at  
  
 http://www.apache.org/licenses/LICENSE-2.0  
Unless required by applicable law or agreed to in writing, software  
distributed under the License is distributed on an "AS IS" BASIS,  
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
See the License for the specific language governing permissions and  
limitations under the License.  
Comments
  • Will fix #3

    Will fix #3

    Will fix #3 I am testing this now in my app. Also, I made 2 similar methods; perhaps there should only be one which does both? IDK.

    [Edit. Sorry, my 2 year old wanted to make a contribution to open source software) ~~080898903v5+v996~~

    ~~89bghb vfgn h ;π888.p inmjmoikm unubh9 ~~~~bnb[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]~~ ~~]]]]]]]]][[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ n=nmko]mknmm\\m \mn \m ~~ , mn mn m,.æ÷~~

    opened by yringler 1
  • Add enum extensions

    Add enum extensions

    Changes to be committed: modified: lib/dart_extensions.dart new file: lib/src/enum.dart modified: lib/src/flutter/context.dart modified: lib/src/flutter/list.dart

    opened by fnp-02 0
  • Add extension methods to limit string size

    Add extension methods to limit string size

    I have multiple cases where I want to use a string, but want to keep it within a certain range. For example, the key in a nosql DB, or a value in firebase analytics. Thefor, I find it convenient to have an extension which can limit to max size, either from start or end. I'll send a PR in a few minutes.

    BTW, thanks for putting this together! It's great to have a central place with useful extension methods.

    opened by yringler 0
  • Added

    Added "asBool" extension getter for String and int.

    String.asBool

    Convert this string into boolean.

    Returns true if this string is any of these values: "true", "yes", "1", or if the string is a number and greater than 0, false if less than 1. This is also case insensitive.

    int.asBool

    Convert this integer into boolean.

    Returns true if this integer is greater than 0.

    opened by xamantra 0
  • Null bug with .isEmptyOrNull on iterables

    Null bug with .isEmptyOrNull on iterables

    I ran into an issue after migrating my project to Null Safety, and wondering if it can be corrected. If I check a list with if(mylist.isEmptyOrNull) it gives an error if the list is null, so it defeats the purpose of using it when we'd otherwise do if(mylist?.isEmpty ?? true) without the extension. So I monkeyed around in your iterable.dart and figured this out separating these from CollectionsExtensions to extension CollectionsNullableExtensions on Iterable? with the questionmark at the end.. Simple enough.

    opened by Skquark 0
  • How to use sortby

    How to use sortby

    The latest version of dart_extensions has a sortby method which takes an EqualityComparer How is this EqualityComparer created? I didn't see any example, and was unable to figure out how.

    opened by yringler 0
  • Add extension for nullable Iterable

    Add extension for nullable Iterable

    Hi i create new extension orEmpty() for nullable Iterable and create new section for nullable Iterable extension e move it all extension that include isEmptyOrNull

    opened by vincenzosarnataro 2
Owner
Idan
Mobile developer - Flutter! Join my Flutter community https://www.facebook.com/groups/flutteril/
Idan
Mysql.dart - MySQL client for Dart written in Dart

Native MySQL client written in Dart for Dart See example directory for examples

null 48 Dec 29, 2022
Docker images for the Dart programming language (https://dart.dev)

dart-docker This is the Git repo of the Docker "Official Images" for the Dart programming language. See the Docker Hub page for a full description on

Dart 49 Dec 14, 2022
A most easily usable Duolingo API wrapper in Dart. Duolingo4D is an open-sourced Dart library.

A most easily usable Duolingo API wrapper in Dart! 1. About Duolingo4D Duolingo4D is an open-sourced Dart library. With Duolingo4D, you can easily int

Kato Shinya 18 Oct 17, 2022
dna, dart native access. A lightweight dart to native super channel plugin

dna, dart native access. A lightweight dart to native super channel plugin, You can use it to invoke any native code directly in contextual and chained dart code.

Assuner 14 Jul 11, 2022
Dart package responsible to provide the basic resources to Lambda Functions with Clean Dart

AWS Lambda Core This package is responsible to provide the basic resources to all services; Usage pubspec.yaml dependencies: aws_lambda_core: <laste

David Araujo 1 Dec 2, 2021
A Dart client for the NATS messaging system. Design to use with Dart and Flutter.

Dart-NATS A Dart client for the NATS messaging system. Design to use with Dart and flutter. Flutter Web Support by WebSocket client.connect(Uri.parse(

Chart Chongcharoen 32 Nov 18, 2022
GitHub Action that uses the Dart Package Analyzer to compute the Pub score of Dart/Flutter packages

Dart/Flutter package analyzer This action uses the pana (Package ANAlysis) package to compute the score that your Dart or Flutter package will have on

Axel Ogereau-Peltier 45 Dec 29, 2022
Dart-com-Shelf - Web server básico feito com dart e shelf, configurações de rotas e conexão com mysql.

A server app built using Shelf, configured to enable running with Docker. This sample code handles HTTP GET requests to / and /echo/<message> Running

Luanzera07 0 Jan 3, 2022
Rock-Paper-Scissor-Game-Using-Dart - This is a repository of Rock Paper Scissor Game which I developed while learning Dart.

Rock-Paper-Scissor-Game-Using-Dart This is a repository of Rock Paper Scissor Game which I developed while learning Dart. The main.dart file consist o

Nitin Varma 0 Jan 4, 2022
Flutter Navigation - all types of navigation in flutter run main.tabBar.dart to see tabBar, and run main.dart to see the otheres

pop_up_bar A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you started if th

Michael Odumosu 0 Jan 1, 2022
Spider - A small dart library to generate Assets dart code from assets folder.

Spider A small dart library to generate Assets dart code from assets folder. It generates dart class with static const variables in it which can be us

Birju Vachhani 159 Nov 8, 2022
Tello-Dart - A testing ground for the Tello drone's socket API in dart

This packages provides a Dart interface to Ryze Tello drones. Getting started Ma

null 2 Jul 27, 2022
🎬 A movie catalog app for both Android & IOS ~ Flutter.io project in Dart | Dart, Bloc, Movies

Movie Catalog App ?? Browse through movies from the YIFY api Getting Started For help getting started with Flutter, view our online documentation. Tod

Jonas De Vrient 49 Nov 21, 2022
Socketio dart server and client - Full Socket.io implementation using Dart Lang

Getting Started Step 1: Run dart_server.dart Step 2: Android Emulator has proble

Trần Thiên Trọng 1 Jan 23, 2022
Dart wrapper via `dart:js` for webusb

Dart wrapper via dart:js for https://wicg.github.io/webusb/ Features canUseUsb g

Woodemi Co., Ltd 1 Jan 25, 2022
Flutter Dart-Projesi - Meditation app developed using Flutter and Dart

Müzik Çalar Meditasyon Uygulaması Medi Flutter ve Dart ile programlanmış bir med

null 2 Jan 29, 2022
Dart-dependency-injection - A simple example of how to use dependency injection with dart

This is a simple example of how to use dependency injection with dart. In this e

Rafael Alves 0 Feb 3, 2022
Dart web3 - A dart library that connects and interacts with the Ethereum blockchain

dart_web3 A dart library that connects and interact with the Ethereum blockchain

p2bh 9 Sep 13, 2022
A build system for Dart written in Dart

These packages provide libraries for generating, compiling and serving Dart code. Getting started with build_runner General FAQ Windows FAQ FAQ for Bu

Dart 676 Dec 24, 2022