├── .fvmrc
├── .gitignore
├── .metadata
├── .vscode
├── launch.json
└── settings.json
├── CHANGELOG.md
├── LICENSE
├── README.md
├── analysis_options.yaml
├── example
├── .gitignore
├── .metadata
├── .vscode
│ └── settings.json
├── android
│ ├── .gitignore
│ ├── app
│ │ ├── build.gradle
│ │ └── src
│ │ │ ├── debug
│ │ │ └── AndroidManifest.xml
│ │ │ ├── main
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin
│ │ │ │ └── com
│ │ │ │ │ └── softmaestri
│ │ │ │ │ └── example
│ │ │ │ │ └── MainActivity.kt
│ │ │ └── res
│ │ │ │ ├── drawable
│ │ │ │ └── launch_background.xml
│ │ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ ├── mipmap-xxxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ │ └── values
│ │ │ │ └── styles.xml
│ │ │ └── profile
│ │ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle.properties
│ ├── gradle
│ │ └── wrapper
│ │ │ └── gradle-wrapper.properties
│ └── settings.gradle
├── ios
│ ├── .gitignore
│ ├── Flutter
│ │ ├── .last_build_id
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Runner.xcodeproj
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace
│ │ │ └── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── xcschemes
│ │ │ └── Runner.xcscheme
│ ├── Runner.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── Runner
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets
│ │ ├── AppIcon.appiconset
│ │ │ ├── Contents.json
│ │ │ ├── Icon-App-1024x1024@1x.png
│ │ │ ├── Icon-App-20x20@1x.png
│ │ │ ├── Icon-App-20x20@2x.png
│ │ │ ├── Icon-App-20x20@3x.png
│ │ │ ├── Icon-App-29x29@1x.png
│ │ │ ├── Icon-App-29x29@2x.png
│ │ │ ├── Icon-App-29x29@3x.png
│ │ │ ├── Icon-App-40x40@1x.png
│ │ │ ├── Icon-App-40x40@2x.png
│ │ │ ├── Icon-App-40x40@3x.png
│ │ │ ├── Icon-App-60x60@2x.png
│ │ │ ├── Icon-App-60x60@3x.png
│ │ │ ├── Icon-App-76x76@1x.png
│ │ │ ├── Icon-App-76x76@2x.png
│ │ │ └── Icon-App-83.5x83.5@2x.png
│ │ └── LaunchImage.imageset
│ │ │ ├── Contents.json
│ │ │ ├── LaunchImage.png
│ │ │ ├── LaunchImage@2x.png
│ │ │ ├── LaunchImage@3x.png
│ │ │ └── README.md
│ │ ├── Base.lproj
│ │ ├── LaunchScreen.storyboard
│ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
├── lib
│ ├── main.dart
│ └── pages
│ │ ├── bitcoin_validator_page.dart
│ │ ├── credit_card_format_page.dart
│ │ ├── masked_formatter_page.dart
│ │ ├── money_format_page.dart
│ │ ├── phone_format_page.dart
│ │ ├── pinyin_formatter_page.dart
│ │ └── pos_format_page.dart
├── pubspec.lock
├── pubspec.yaml
└── test
│ └── widget_test.dart
├── flags
└── png
│ ├── ad.png
│ ├── ae.png
│ ├── af.png
│ ├── ag.png
│ ├── ai.png
│ ├── al.png
│ ├── am.png
│ ├── an.png
│ ├── ao.png
│ ├── aq.png
│ ├── ar.png
│ ├── as.png
│ ├── at.png
│ ├── au.png
│ ├── aw.png
│ ├── ax.png
│ ├── az.png
│ ├── ba.png
│ ├── bb.png
│ ├── bd.png
│ ├── be.png
│ ├── bf.png
│ ├── bg.png
│ ├── bh.png
│ ├── bi.png
│ ├── bj.png
│ ├── bl.png
│ ├── bm.png
│ ├── bn.png
│ ├── bo.png
│ ├── bq.png
│ ├── br.png
│ ├── bs.png
│ ├── bt.png
│ ├── bv.png
│ ├── bw.png
│ ├── by.png
│ ├── bz.png
│ ├── ca.png
│ ├── cc.png
│ ├── cd.png
│ ├── cf.png
│ ├── cg.png
│ ├── ch.png
│ ├── ci.png
│ ├── ck.png
│ ├── cl.png
│ ├── cm.png
│ ├── cn.png
│ ├── co.png
│ ├── cr.png
│ ├── cu.png
│ ├── cv.png
│ ├── cw.png
│ ├── cx.png
│ ├── cy.png
│ ├── cz.png
│ ├── de.png
│ ├── dj.png
│ ├── dk.png
│ ├── dm.png
│ ├── do.png
│ ├── dz.png
│ ├── ec.png
│ ├── ee.png
│ ├── eg.png
│ ├── eh.png
│ ├── er.png
│ ├── es.png
│ ├── et.png
│ ├── eu.png
│ ├── fi.png
│ ├── fj.png
│ ├── fk.png
│ ├── fm.png
│ ├── fo.png
│ ├── fr.png
│ ├── ga.png
│ ├── gb-eng.png
│ ├── gb-nir.png
│ ├── gb-sct.png
│ ├── gb-wls.png
│ ├── gb.png
│ ├── gd.png
│ ├── ge.png
│ ├── gf.png
│ ├── gg.png
│ ├── gh.png
│ ├── gi.png
│ ├── gl.png
│ ├── gm.png
│ ├── gn.png
│ ├── gp.png
│ ├── gq.png
│ ├── gr.png
│ ├── gs.png
│ ├── gt.png
│ ├── gu.png
│ ├── gw.png
│ ├── gy.png
│ ├── hk.png
│ ├── hm.png
│ ├── hn.png
│ ├── hr.png
│ ├── ht.png
│ ├── hu.png
│ ├── id.png
│ ├── ie.png
│ ├── il.png
│ ├── im.png
│ ├── in.png
│ ├── io.png
│ ├── iq.png
│ ├── ir.png
│ ├── is.png
│ ├── it.png
│ ├── je.png
│ ├── jm.png
│ ├── jo.png
│ ├── jp.png
│ ├── ke.png
│ ├── kg.png
│ ├── kh.png
│ ├── ki.png
│ ├── km.png
│ ├── kn.png
│ ├── kp.png
│ ├── kr.png
│ ├── kw.png
│ ├── ky.png
│ ├── kz.png
│ ├── la.png
│ ├── lb.png
│ ├── lc.png
│ ├── li.png
│ ├── lk.png
│ ├── lr.png
│ ├── ls.png
│ ├── lt.png
│ ├── lu.png
│ ├── lv.png
│ ├── ly.png
│ ├── ma.png
│ ├── mc.png
│ ├── md.png
│ ├── me.png
│ ├── mf.png
│ ├── mg.png
│ ├── mh.png
│ ├── mk.png
│ ├── ml.png
│ ├── mm.png
│ ├── mn.png
│ ├── mo.png
│ ├── mp.png
│ ├── mq.png
│ ├── mr.png
│ ├── ms.png
│ ├── mt.png
│ ├── mu.png
│ ├── mv.png
│ ├── mw.png
│ ├── mx.png
│ ├── my.png
│ ├── mz.png
│ ├── na.png
│ ├── nc.png
│ ├── ne.png
│ ├── nf.png
│ ├── ng.png
│ ├── ni.png
│ ├── nl.png
│ ├── no.png
│ ├── np.png
│ ├── nr.png
│ ├── nu.png
│ ├── nz.png
│ ├── om.png
│ ├── pa.png
│ ├── pe.png
│ ├── pf.png
│ ├── pg.png
│ ├── ph.png
│ ├── pk.png
│ ├── pl.png
│ ├── pm.png
│ ├── pn.png
│ ├── pr.png
│ ├── ps.png
│ ├── pt.png
│ ├── pw.png
│ ├── py.png
│ ├── qa.png
│ ├── re.png
│ ├── ro.png
│ ├── rs.png
│ ├── ru.png
│ ├── rw.png
│ ├── sa.png
│ ├── sb.png
│ ├── sc.png
│ ├── sd.png
│ ├── se.png
│ ├── sg.png
│ ├── sh.png
│ ├── si.png
│ ├── sj.png
│ ├── sk.png
│ ├── sl.png
│ ├── sm.png
│ ├── sn.png
│ ├── so.png
│ ├── sr.png
│ ├── ss.png
│ ├── st.png
│ ├── sv.png
│ ├── sx.png
│ ├── sy.png
│ ├── sz.png
│ ├── tc.png
│ ├── td.png
│ ├── tf.png
│ ├── tg.png
│ ├── th.png
│ ├── tj.png
│ ├── tk.png
│ ├── tl.png
│ ├── tm.png
│ ├── tn.png
│ ├── to.png
│ ├── tr.png
│ ├── tt.png
│ ├── tv.png
│ ├── tw.png
│ ├── tz.png
│ ├── ua.png
│ ├── ug.png
│ ├── um.png
│ ├── us.png
│ ├── uy.png
│ ├── uz.png
│ ├── va.png
│ ├── vc.png
│ ├── ve.png
│ ├── vg.png
│ ├── vi.png
│ ├── vn.png
│ ├── vu.png
│ ├── wf.png
│ ├── ws.png
│ ├── xk.png
│ ├── ye.png
│ ├── yt.png
│ ├── za.png
│ ├── zm.png
│ └── zw.png
├── lib
├── extensions
│ ├── double_extensions.dart
│ ├── exports.dart
│ ├── int_extensions.dart
│ └── string_extensions.dart
├── flutter_multi_formatter.dart
├── formatters
│ ├── all_fiat_currencies.dart
│ ├── credit_card_cvc_input_formatter.dart
│ ├── credit_card_expiration_input_formatter.dart
│ ├── credit_card_number_input_formatter.dart
│ ├── currency_input_formatter.dart
│ ├── formatter_extension_methods.dart
│ ├── formatter_utils.dart
│ ├── masked_input_formatter.dart
│ ├── money_input_enums.dart
│ ├── money_input_formatter.dart
│ ├── phone_input_enums.dart
│ ├── phone_input_formatter.dart
│ ├── pinyin_formatter.dart
│ └── pos_input_formatter.dart
├── utils
│ ├── bitcoin_validator
│ │ ├── bitcoin_validator.dart
│ │ └── bitcoin_wallet_details.dart
│ ├── enum_utils.dart
│ ├── hanzi_utils.dart
│ ├── luhn_algo.dart
│ ├── pinyin_utils.dart
│ └── unfocuser.dart
└── widgets
│ ├── country_dropdown.dart
│ └── country_flag.dart
├── pubspec.lock
├── pubspec.yaml
├── test
├── flutter_money_input_formatter_test.dart
├── flutter_multi_formatter_test.dart
├── flutter_pos_input_formatter_test.dart
└── pinyin_syllable_converter.dart
└── публикация
/.fvmrc:
--------------------------------------------------------------------------------
1 | {
2 | "flutter": "3.29.2",
3 | "flavors": {}
4 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | #.vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | build/
32 |
33 | # Android related
34 | **/android/**/gradle-wrapper.jar
35 | **/android/.gradle
36 | **/android/captures/
37 | **/android/gradlew
38 | **/android/gradlew.bat
39 | **/android/local.properties
40 | **/android/**/GeneratedPluginRegistrant.java
41 |
42 | # iOS/XCode related
43 | **/ios/**/*.mode1v3
44 | **/ios/**/*.mode2v3
45 | **/ios/**/*.moved-aside
46 | **/ios/**/*.pbxuser
47 | **/ios/**/*.perspectivev3
48 | **/ios/**/*sync/
49 | **/ios/**/.sconsign.dblite
50 | **/ios/**/.tags*
51 | **/ios/**/.vagrant/
52 | **/ios/**/DerivedData/
53 | **/ios/**/Icon?
54 | **/ios/**/Pods/
55 | **/ios/**/.symlinks/
56 | **/ios/**/profile
57 | **/ios/**/xcuserdata
58 | **/ios/.generated/
59 | **/ios/Flutter/App.framework
60 | **/ios/Flutter/Flutter.framework
61 | **/ios/Flutter/Flutter.podspec
62 | **/ios/Flutter/Generated.xcconfig
63 | **/ios/Flutter/app.flx
64 | **/ios/Flutter/app.zip
65 | **/ios/Flutter/flutter_assets/
66 | **/ios/Flutter/flutter_export_environment.sh
67 | **/ios/ServiceDefinitions.json
68 | **/ios/Runner/GeneratedPluginRegistrant.*
69 |
70 | # Exceptions to above rules.
71 | !**/ios/**/default.mode1v3
72 | !**/ios/**/default.mode2v3
73 | !**/ios/**/default.pbxuser
74 | !**/ios/**/default.perspectivev3
75 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
76 | .vscode/settings.json
77 |
78 | # FVM Version Cache
79 | .fvm/
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 27321ebbad34b0a3fafe99fac037102196d655ff
8 | channel: stable
9 |
10 | project_type: package
11 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.2.0",
3 | "configurations": [
4 | {
5 | "name": "Chrome",
6 | "program": "example/lib/main.dart",
7 | "request": "launch",
8 | "type": "dart",
9 | "args": [
10 | "-d",
11 | "chrome",
12 | "--web-port",
13 | "55555"
14 | ]
15 | },
16 | {
17 | "name": "Dev",
18 | "request": "launch",
19 | "type": "dart",
20 | "program": "example/lib/main.dart",
21 | },
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "dart.flutterSdkPath": ".fvm/versions/3.29.2",
3 | "git-blame.gitWebUrl": "",
4 | "cSpell.words": [
5 | "bech",
6 | "Schyler"
7 | ]
8 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | /*
2 | (c) Copyright 2020 Serov Konstantin.
3 |
4 | Licensed under the MIT license:
5 |
6 | http://www.opensource.org/licenses/mit-license.php
7 |
8 | Permission is hereby granted, free of charge, to any person obtaining a copy
9 | of this software and associated documentation files (the "Software"), to deal
10 | in the Software without restriction, including without limitation the rights
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | copies of the Software, and to permit persons to whom the Software is
13 | furnished to do so, subject to the following conditions:
14 |
15 | The above copyright notice and this permission notice shall be included in
16 | all copies or substantial portions of the Software.
17 |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | THE SOFTWARE.
25 | */
--------------------------------------------------------------------------------
/analysis_options.yaml:
--------------------------------------------------------------------------------
1 | # Better code style
--------------------------------------------------------------------------------
/example/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # The .vscode folder contains launch configuration and tasks you configure in
19 | # VS Code which you may wish to be included in version control, so this line
20 | # is commented out by default.
21 | #.vscode/
22 |
23 | # Flutter/Dart/Pub related
24 | **/doc/api/
25 | .dart_tool/
26 | .flutter-plugins
27 | .flutter-plugins-dependencies
28 | .packages
29 | .pub-cache/
30 | .pub/
31 | /build/
32 |
33 | # Web related
34 | lib/generated_plugin_registrant.dart
35 |
36 | # Exceptions to above rules.
37 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
38 |
--------------------------------------------------------------------------------
/example/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 27321ebbad34b0a3fafe99fac037102196d655ff
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/example/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "dart.flutterSdkPath": "/Users/konstantin/fvm/versions/1.22.4"
3 | }
--------------------------------------------------------------------------------
/example/android/.gitignore:
--------------------------------------------------------------------------------
1 | gradle-wrapper.jar
2 | /.gradle
3 | /captures/
4 | /gradlew
5 | /gradlew.bat
6 | /local.properties
7 | GeneratedPluginRegistrant.java
8 |
--------------------------------------------------------------------------------
/example/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply plugin: 'kotlin-android'
26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
27 |
28 | android {
29 | compileSdkVersion 32
30 |
31 | sourceSets {
32 | main.java.srcDirs += 'src/main/kotlin'
33 | }
34 |
35 | lintOptions {
36 | disable 'InvalidPackage'
37 | }
38 |
39 | defaultConfig {
40 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
41 | applicationId "com.softmaestri.example"
42 | minSdkVersion 16
43 | targetSdkVersion 28
44 | versionCode flutterVersionCode.toInteger()
45 | versionName flutterVersionName
46 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
47 | }
48 |
49 | buildTypes {
50 | release {
51 | // TODO: Add your own signing config for the release build.
52 | // Signing with the debug keys for now, so `flutter run --release` works.
53 | signingConfig signingConfigs.debug
54 | }
55 | }
56 | }
57 |
58 | flutter {
59 | source '../..'
60 | }
61 |
62 | dependencies {
63 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
64 | testImplementation 'junit:junit:4.12'
65 | androidTestImplementation 'androidx.test:runner:1.1.1'
66 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
67 | }
68 |
--------------------------------------------------------------------------------
/example/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/example/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
8 |
12 |
19 |
20 |
21 |
22 |
23 |
24 |
26 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/example/android/app/src/main/kotlin/com/softmaestri/example/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.softmaestri.example
2 |
3 | import androidx.annotation.NonNull;
4 | import io.flutter.embedding.android.FlutterActivity
5 | import io.flutter.embedding.engine.FlutterEngine
6 | import io.flutter.plugins.GeneratedPluginRegistrant
7 |
8 | class MainActivity: FlutterActivity() {
9 | override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
10 | GeneratedPluginRegistrant.registerWith(flutterEngine);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/example/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/example/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/example/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/example/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.kotlin_version = '1.6.10'
3 | repositories {
4 | google()
5 | jcenter()
6 | }
7 |
8 | dependencies {
9 | classpath 'com.android.tools.build:gradle:7.2.0'
10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11 | }
12 | }
13 |
14 | allprojects {
15 | repositories {
16 | google()
17 | jcenter()
18 | }
19 | }
20 |
21 | rootProject.buildDir = '../build'
22 | subprojects {
23 | project.buildDir = "${rootProject.buildDir}/${project.name}"
24 | }
25 | subprojects {
26 | project.evaluationDependsOn(':app')
27 | }
28 |
29 | task clean(type: Delete) {
30 | delete rootProject.buildDir
31 | }
32 |
--------------------------------------------------------------------------------
/example/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 | android.enableR8=true
3 | android.useAndroidX=true
4 | android.enableJetifier=true
5 |
--------------------------------------------------------------------------------
/example/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
7 |
--------------------------------------------------------------------------------
/example/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/example/ios/.gitignore:
--------------------------------------------------------------------------------
1 | *.mode1v3
2 | *.mode2v3
3 | *.moved-aside
4 | *.pbxuser
5 | *.perspectivev3
6 | **/*sync/
7 | .sconsign.dblite
8 | .tags*
9 | **/.vagrant/
10 | **/DerivedData/
11 | Icon?
12 | **/Pods/
13 | **/.symlinks/
14 | profile
15 | xcuserdata
16 | **/.generated/
17 | Flutter/App.framework
18 | Flutter/Flutter.framework
19 | Flutter/Flutter.podspec
20 | Flutter/Generated.xcconfig
21 | Flutter/app.flx
22 | Flutter/app.zip
23 | Flutter/flutter_assets/
24 | Flutter/flutter_export_environment.sh
25 | ServiceDefinitions.json
26 | Runner/GeneratedPluginRegistrant.*
27 |
28 | # Exceptions to above rules.
29 | !default.mode1v3
30 | !default.mode2v3
31 | !default.pbxuser
32 | !default.perspectivev3
33 |
--------------------------------------------------------------------------------
/example/ios/Flutter/.last_build_id:
--------------------------------------------------------------------------------
1 | 394957004a5d9bb861c6d2e85d9b4115
--------------------------------------------------------------------------------
/example/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 11.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/example/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/example/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/example/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/example/ios/Runner/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 | import Flutter
3 |
4 | @UIApplicationMain
5 | @objc class AppDelegate: FlutterAppDelegate {
6 | override func application(
7 | _ application: UIApplication,
8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
9 | ) -> Bool {
10 | GeneratedPluginRegistrant.register(with: self)
11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
--------------------------------------------------------------------------------
/example/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/example/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/example/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | example
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 | CADisableMinimumFrameDurationOnPhone
45 |
46 | UIApplicationSupportsIndirectInputEvents
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/example/ios/Runner/Runner-Bridging-Header.h:
--------------------------------------------------------------------------------
1 | #import "GeneratedPluginRegistrant.h"
--------------------------------------------------------------------------------
/example/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:example/pages/bitcoin_validator_page.dart';
2 | import 'package:example/pages/credit_card_format_page.dart';
3 | import 'package:example/pages/masked_formatter_page.dart';
4 | import 'package:example/pages/money_format_page.dart';
5 | import 'package:example/pages/phone_format_page.dart';
6 | import 'package:example/pages/pos_format_page.dart';
7 | import 'package:flutter/cupertino.dart';
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_multi_formatter/flutter_multi_formatter.dart';
10 |
11 | import 'pages/pinyin_formatter_page.dart';
12 |
13 | typedef PageBuilder = Widget Function();
14 |
15 | void main() => runApp(MyApp());
16 |
17 | class MyApp extends StatelessWidget {
18 | @override
19 | Widget build(BuildContext context) {
20 | return MaterialApp(
21 | title: 'Multi formatter demo',
22 | debugShowCheckedModeBanner: false,
23 | theme: ThemeData(
24 | primarySwatch: Colors.blue,
25 | ),
26 | home: MyHomePage(),
27 | );
28 | }
29 | }
30 |
31 | class MyHomePage extends StatefulWidget {
32 | @override
33 | _MyHomePageState createState() => _MyHomePageState();
34 | }
35 |
36 | class _MyHomePageState extends State {
37 | void openPage(Widget page) {
38 | Navigator.of(context).push(
39 | CupertinoPageRoute(
40 | builder: (BuildContext context) {
41 | return page;
42 | },
43 | ),
44 | );
45 | }
46 |
47 | @override
48 | void initState() {
49 | super.initState();
50 |
51 | PhoneInputFormatter.addAlternativePhoneMasks(
52 | countryCode: 'NZ',
53 | alternativeMasks: [
54 | '+00 (0) 000 0000',
55 | '+00 (00) 000 0000',
56 | '+00 (000) 000 0000',
57 | ],
58 | );
59 | }
60 |
61 | Widget _buildButton({
62 | required Color color,
63 | required IconData iconData,
64 | required String label,
65 | required PageBuilder pageBuilder,
66 | }) {
67 | return Padding(
68 | padding: const EdgeInsets.only(
69 | top: 10,
70 | bottom: 10,
71 | ),
72 | child: Container(
73 | height: 50,
74 | child: MaterialButton(
75 | textColor: Colors.white,
76 | color: color,
77 | onPressed: () {
78 | openPage(
79 | pageBuilder(),
80 | );
81 | },
82 | child: Row(
83 | children: [
84 | Icon(iconData),
85 | Expanded(
86 | child: Center(
87 | child: Text(label),
88 | ),
89 | ),
90 | ],
91 | ),
92 | ),
93 | ),
94 | );
95 | }
96 |
97 | @override
98 | Widget build(BuildContext context) {
99 | return Scaffold(
100 | appBar: AppBar(
101 | title: Text('Formatters Demo App'),
102 | centerTitle: true,
103 | ),
104 | body: Center(
105 | child: Padding(
106 | padding: const EdgeInsets.all(
107 | 30.0,
108 | ),
109 | child: Column(
110 | mainAxisAlignment: MainAxisAlignment.center,
111 | children: [
112 | _buildButton(
113 | color: Colors.lightGreen,
114 | iconData: Icons.phone,
115 | label: 'Phone Formatter Demo',
116 | pageBuilder: () => PhoneFormatPage(),
117 | ),
118 | _buildButton(
119 | color: Colors.lightBlue,
120 | iconData: Icons.credit_card,
121 | label: 'Credit Card Formatter Demo',
122 | pageBuilder: () => CreditCardFormatPage(),
123 | ),
124 | _buildButton(
125 | color: Colors.orange,
126 | iconData: Icons.masks_outlined,
127 | label: 'Masked input formatter Demo',
128 | pageBuilder: () => MaskedFormatterPage(),
129 | ),
130 | _buildButton(
131 | color: Colors.pink[400]!,
132 | iconData: Icons.attach_money,
133 | label: 'Money formatter',
134 | pageBuilder: () => MoneyFormatPage(),
135 | ),
136 | _buildButton(
137 | color: Colors.green[600]!,
138 | iconData: Icons.attach_money,
139 | label: 'Bitcoin Validator',
140 | pageBuilder: () => BitcoinValidatorPage(),
141 | ),
142 | _buildButton(
143 | color: Colors.purple,
144 | iconData: Icons.money_off,
145 | label: 'Pos Formatter',
146 | pageBuilder: () => PosFormatPage(),
147 | ),
148 | _buildButton(
149 | color: Colors.red,
150 | iconData: Icons.abc,
151 | label: 'Chinese Pinyin Formatter',
152 | pageBuilder: () => PinyinFormatterPage(),
153 | ),
154 | ],
155 | ),
156 | ),
157 | ),
158 | );
159 | }
160 | }
161 |
--------------------------------------------------------------------------------
/example/lib/pages/bitcoin_validator_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_multi_formatter/flutter_multi_formatter.dart';
3 |
4 | class BitcoinValidatorPage extends StatefulWidget {
5 | @override
6 | _BitcoinValidatorPageState createState() => _BitcoinValidatorPageState();
7 | }
8 |
9 | class _BitcoinValidatorPageState extends State {
10 | GlobalKey _formKey = GlobalKey();
11 | BitcoinWalletDetails? _bitcoinWalletDetails;
12 | BitcoinWalletType? _bitcoinWalletType;
13 | bool? _isValid;
14 | FormFieldValidator _validator = (String? v) {
15 | return null;
16 | };
17 |
18 | Widget _getText(String text) {
19 | return Padding(
20 | padding: const EdgeInsets.symmetric(vertical: 15.0),
21 | child: Text(text),
22 | );
23 | }
24 |
25 | Widget _buildButton({
26 | required IconData iconData,
27 | required String label,
28 | required VoidCallback onPressed,
29 | required Color color,
30 | }) {
31 | return Padding(
32 | padding: const EdgeInsets.only(
33 | top: 10,
34 | bottom: 10,
35 | ),
36 | child: Container(
37 | height: 50,
38 | child: ElevatedButton(
39 | style: ButtonStyle(
40 | backgroundColor: MaterialStateProperty.all(
41 | color,
42 | ),
43 | ),
44 | onPressed: onPressed,
45 | child: Row(
46 | children: [
47 | Icon(iconData),
48 | Expanded(
49 | child: Center(
50 | child: Text(label),
51 | ),
52 | ),
53 | ],
54 | ),
55 | ),
56 | ),
57 | );
58 | }
59 |
60 | /// A small hack to avoid warnings on flutter 2 and 3
61 | dynamic get _widgetsBinding {
62 | return WidgetsBinding.instance;
63 | }
64 |
65 | void _onValidatePressed() {
66 | _widgetsBinding?.addPostFrameCallback((timeStamp) {
67 | setState(() {
68 | _formKey.currentState!.save();
69 | _formKey.currentState!.validate();
70 | });
71 | });
72 | }
73 |
74 | Widget _buildWalletDetails() {
75 | String text = '';
76 | if (_isValid != null) {
77 | text = 'Is valid: $_isValid';
78 | } else if (_bitcoinWalletType != null) {
79 | text = 'Wallet type: ${enumToString(_bitcoinWalletType)}';
80 | } else if (_bitcoinWalletDetails != null) {
81 | text = _bitcoinWalletDetails.toString();
82 | } else {
83 | return SizedBox(height: 20.0);
84 | }
85 | return Padding(
86 | padding: const EdgeInsets.only(
87 | top: 20.0,
88 | bottom: 20.0,
89 | ),
90 | child: Text(text),
91 | );
92 | }
93 |
94 | void _reset() {
95 | _isValid = null;
96 | _bitcoinWalletType = null;
97 | _bitcoinWalletDetails = null;
98 | }
99 |
100 | String? _fullDetailsValidator(String? value) {
101 | _bitcoinWalletDetails = getBitcoinWalletDetails(value);
102 | if (_bitcoinWalletDetails?.isValid != true) {
103 | _bitcoinWalletDetails = null;
104 | return 'Invalid wallet address';
105 | }
106 | return null;
107 | }
108 |
109 | String? _typeValidator(String? value) {
110 | _bitcoinWalletType = getBitcoinWalletType(value);
111 | if (_bitcoinWalletType == BitcoinWalletType.None) {
112 | _bitcoinWalletType = null;
113 | return 'Invalid wallet address';
114 | }
115 | return null;
116 | }
117 |
118 | String? _simpleTrueFalseValidator(String? value) {
119 | _isValid = isBitcoinWalletValid(value);
120 | return null;
121 | }
122 |
123 | @override
124 | void initState() {
125 | super.initState();
126 | }
127 |
128 | @override
129 | Widget build(BuildContext context) {
130 | return Unfocuser(
131 | child: Scaffold(
132 | appBar: AppBar(
133 | centerTitle: true,
134 | title: Text('Bitcoin Validator Demo'),
135 | ),
136 | body: SingleChildScrollView(
137 | child: Padding(
138 | padding: const EdgeInsets.all(30.0),
139 | child: Form(
140 | key: _formKey,
141 | child: Column(
142 | children: [
143 | _getText('BTC Wallet Details Check'),
144 | TextFormField(
145 | decoration: InputDecoration(
146 | border: OutlineInputBorder(),
147 | hintText: 'Enter a BTC wallet address',
148 | hintStyle: TextStyle(
149 | color: Colors.black.withOpacity(.3),
150 | ),
151 | errorStyle: TextStyle(
152 | color: Colors.red,
153 | ),
154 | ),
155 | initialValue: '1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2',
156 | keyboardType: TextInputType.text,
157 | validator: _validator,
158 | ),
159 | _buildWalletDetails(),
160 | Text('Shows full details of a valid wallet'),
161 | _buildButton(
162 | color: Colors.red,
163 | iconData: Icons.check,
164 | label: 'Check Wallet Details',
165 | onPressed: () {
166 | _reset();
167 | setState(() {
168 | _validator = _fullDetailsValidator;
169 | _onValidatePressed();
170 | });
171 | },
172 | ),
173 | Text('Only shows the type of a valid wallet'),
174 | _buildButton(
175 | color: Colors.pink[900]!,
176 | iconData: Icons.check,
177 | label: 'Simple Wallet Type Check',
178 | onPressed: () {
179 | _reset();
180 | setState(() {
181 | _validator = _typeValidator;
182 | _onValidatePressed();
183 | });
184 | },
185 | ),
186 | Text('Simple validity check'),
187 | _buildButton(
188 | color: Colors.pink[500]!,
189 | iconData: Icons.check,
190 | label: 'Simple Wallet Type Check',
191 | onPressed: () {
192 | _reset();
193 | setState(() {
194 | _validator = _simpleTrueFalseValidator;
195 | _onValidatePressed();
196 | });
197 | },
198 | ),
199 | ],
200 | ),
201 | ),
202 | ),
203 | ),
204 | ),
205 | );
206 | }
207 | }
208 |
--------------------------------------------------------------------------------
/example/lib/pages/credit_card_format_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_multi_formatter/flutter_multi_formatter.dart';
3 |
4 | class CreditCardFormatPage extends StatefulWidget {
5 | @override
6 | _CreditCardFormatPageState createState() => _CreditCardFormatPageState();
7 | }
8 |
9 | class _CreditCardFormatPageState extends State {
10 | GlobalKey _formKey = GlobalKey();
11 |
12 | CardSystemData? _cardSystemData;
13 |
14 | Widget _getText(String text) {
15 | return Padding(
16 | padding: const EdgeInsets.symmetric(
17 | vertical: 15.0,
18 | ),
19 | child: Text(text),
20 | );
21 | }
22 |
23 | @override
24 | Widget build(BuildContext context) {
25 | return Unfocuser(
26 | child: Scaffold(
27 | appBar: AppBar(
28 | centerTitle: true,
29 | title: Text('Card Formatter Demo'),
30 | ),
31 | body: SingleChildScrollView(
32 | child: Padding(
33 | padding: const EdgeInsets.all(30.0),
34 | child: Form(
35 | key: _formKey,
36 | child: Column(
37 | crossAxisAlignment: CrossAxisAlignment.start,
38 | children: [
39 | _getText(
40 | 'This form allows you to easily type a credit / debit card data'),
41 | SizedBox(height: 20.0),
42 | _getText('Any small latin letter'),
43 | TextFormField(
44 | decoration: InputDecoration(
45 | border: OutlineInputBorder(),
46 | hintText: '#### #### #### ####',
47 | hintStyle: TextStyle(
48 | color: Colors.black.withOpacity(.3),
49 | ),
50 | errorStyle: TextStyle(
51 | color: Colors.red,
52 | ),
53 | ),
54 | keyboardType: TextInputType.text,
55 | inputFormatters: [
56 | MaskedInputFormatter(
57 | "#### #### #### ####",
58 | allowedCharMatcher: RegExp(r'[a-z]+'),
59 | ),
60 | ],
61 | ),
62 | _getText('Card number'),
63 | TextFormField(
64 | decoration: InputDecoration(
65 | border: OutlineInputBorder(),
66 | hintText: 'CARD NUMBER',
67 | hintStyle: TextStyle(
68 | color: Colors.black.withOpacity(.3),
69 | ),
70 | errorStyle: TextStyle(
71 | color: Colors.red,
72 | ),
73 | ),
74 | keyboardType: TextInputType.number,
75 | inputFormatters: [
76 | CreditCardNumberInputFormatter(
77 | onCardSystemSelected: (CardSystemData? cardSystemData) {
78 | setState(() {
79 | _cardSystemData = cardSystemData;
80 | });
81 | },
82 | ),
83 | ],
84 | ),
85 | Padding(
86 | padding: const EdgeInsets.symmetric(
87 | vertical: 10.0,
88 | ),
89 | child: Text(
90 | _cardSystemData?.system ?? '',
91 | textAlign: TextAlign.left,
92 | ),
93 | ),
94 | _getText(
95 | 'Valid through\n (this formatter won\'t let you type the "month" part value larger than 12)',
96 | ),
97 | TextFormField(
98 | decoration: InputDecoration(
99 | border: OutlineInputBorder(),
100 | hintText: '00/00',
101 | hintStyle: TextStyle(
102 | color: Colors.black.withOpacity(.3),
103 | ),
104 | errorStyle: TextStyle(
105 | color: Colors.red,
106 | ),
107 | ),
108 | keyboardType: TextInputType.number,
109 | inputFormatters: [
110 | CreditCardExpirationDateFormatter(),
111 | ],
112 | ),
113 | _getText('CVV code'),
114 | TextFormField(
115 | decoration: InputDecoration(
116 | border: OutlineInputBorder(),
117 | hintText: '000',
118 | hintStyle: TextStyle(
119 | color: Colors.black.withOpacity(.3),
120 | ),
121 | errorStyle: TextStyle(
122 | color: Colors.red,
123 | ),
124 | ),
125 | keyboardType: TextInputType.number,
126 | inputFormatters: [
127 | CreditCardCvcInputFormatter(
128 | isAmericanExpress: false,
129 | ),
130 | ],
131 | ),
132 | ],
133 | ),
134 | ),
135 | ),
136 | ),
137 | ),
138 | );
139 | }
140 | }
141 |
--------------------------------------------------------------------------------
/example/lib/pages/masked_formatter_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_multi_formatter/flutter_multi_formatter.dart';
3 |
4 | class MaskedFormatterPage extends StatefulWidget {
5 | @override
6 | _MaskedFormatterPageState createState() => _MaskedFormatterPageState();
7 | }
8 |
9 | class _MaskedFormatterPageState extends State {
10 | GlobalKey _formKey = GlobalKey();
11 | String _result = '';
12 |
13 | Widget _getText(String text) {
14 | return Padding(
15 | padding: const EdgeInsets.symmetric(vertical: 15.0),
16 | child: Text(text),
17 | );
18 | }
19 |
20 | @override
21 | Widget build(BuildContext context) {
22 | return Unfocuser(
23 | child: Scaffold(
24 | appBar: AppBar(
25 | centerTitle: true,
26 | title: Text('Masled Formatter Demo'),
27 | ),
28 | body: SingleChildScrollView(
29 | child: Padding(
30 | padding: const EdgeInsets.all(30.0),
31 | child: Form(
32 | key: _formKey,
33 | child: Column(
34 | children: [
35 | _getText(
36 | 'Applies masked input formatter',
37 | ),
38 | SizedBox(height: 20.0),
39 | _getText('Any char'),
40 | TextFormField(
41 | decoration: InputDecoration(
42 | border: OutlineInputBorder(),
43 | hintText: '#0# 0#0',
44 | hintStyle: TextStyle(
45 | color: Colors.black.withOpacity(.3),
46 | ),
47 | errorStyle: TextStyle(
48 | color: Colors.red,
49 | ),
50 | ),
51 | keyboardType: TextInputType.text,
52 | inputFormatters: [
53 | MaskedInputFormatter(
54 | "#0# 0#0",
55 | allowedCharMatcher: RegExp('[a-z]'),
56 | ),
57 | ],
58 | ),
59 | _getText('Retirement card(Numbers only)'),
60 | TextFormField(
61 | decoration: InputDecoration(
62 | border: OutlineInputBorder(),
63 | hintText: '000-000-000 00',
64 | hintStyle: TextStyle(
65 | color: Colors.black.withOpacity(.3),
66 | ),
67 | errorStyle: TextStyle(
68 | color: Colors.red,
69 | ),
70 | ),
71 | // keyboardType: TextInputType.text,
72 | inputFormatters: [
73 | MaskedInputFormatter(
74 | '000-000-000 00',
75 | // anyCharMatcher: RegExp(r'[a-z]+'),
76 | ),
77 | ],
78 | ),
79 | SizedBox(
80 | height: 20.0,
81 | ),
82 | TextFormField(
83 | decoration: InputDecoration(
84 | border: OutlineInputBorder(),
85 | hintText: '(00) 00000-0000',
86 | hintStyle: TextStyle(
87 | color: Colors.black.withOpacity(.3),
88 | ),
89 | errorStyle: TextStyle(
90 | color: Colors.red,
91 | ),
92 | ),
93 | // keyboardType: TextInputType.text,
94 | inputFormatters: [
95 | MaskedInputFormatter(
96 | '(00) 00000-0000',
97 | // anyCharMatcher: RegExp(r'[a-z]+'),
98 | ),
99 | ],
100 | ),
101 | _getText('Retirement card(Any chars)'),
102 | TextFormField(
103 | decoration: InputDecoration(
104 | border: OutlineInputBorder(),
105 | hintText: '###-###-### ##',
106 | hintStyle: TextStyle(
107 | color: Colors.black.withOpacity(.3),
108 | ),
109 | errorStyle: TextStyle(
110 | color: Colors.red,
111 | ),
112 | ),
113 | // keyboardType: TextInputType.text,
114 | inputFormatters: [
115 | MaskedInputFormatter(
116 | '###-###-### ##',
117 | // anyCharMatcher: RegExp(r'[a-z]+'),
118 | ),
119 | ],
120 | ),
121 | TextButton(
122 | onPressed: () {
123 | setState(
124 | () {
125 | _result = MaskedInputFormatter('000-000-000 00')
126 | .applyMask(
127 | '12345678900',
128 | )
129 | .toString();
130 | },
131 | );
132 | },
133 | child: Text('Apply mask 000-000-000 00'),
134 | ),
135 | Text('12345678900'),
136 | _getText('Result'),
137 | Text(_result),
138 | ],
139 | ),
140 | ),
141 | ),
142 | ),
143 | ),
144 | );
145 | }
146 | }
147 |
--------------------------------------------------------------------------------
/example/lib/pages/pinyin_formatter_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_multi_formatter/flutter_multi_formatter.dart';
3 |
4 | class PinyinFormatterPage extends StatelessWidget {
5 | const PinyinFormatterPage({
6 | Key? key,
7 | }) : super(key: key);
8 |
9 | @override
10 | Widget build(BuildContext context) {
11 | return Unfocuser(
12 | child: Scaffold(
13 | appBar: AppBar(
14 | centerTitle: true,
15 | title: Text('Pinyin Formatter Demo'),
16 | ),
17 | body: SingleChildScrollView(
18 | child: Padding(
19 | padding: const EdgeInsets.all(30.0),
20 | child: Column(
21 | children: [
22 | SelectableText(
23 | "Example: \"wǒhěngāoxìngrènshinǐ\" must split into: \"wǒ'hěn'gāo'xìng'rèn'shi'nǐ\"\nYou can also type in plain english characters like \"wohengaoxingrenshini\" it will also work",
24 | ),
25 | SizedBox(height: 12.0),
26 | TextFormField(
27 | autocorrect: false,
28 | decoration: InputDecoration(
29 | border: const OutlineInputBorder(),
30 | hintText: 'Enter pinyin phrase',
31 | hintStyle: TextStyle(
32 | color: Colors.black.withOpacity(0.3),
33 | ),
34 | errorStyle: TextStyle(
35 | color: Colors.red,
36 | ),
37 | ),
38 | keyboardType: TextInputType.text,
39 | inputFormatters: const [
40 | PinyinFormatter(),
41 | ],
42 | ),
43 | ],
44 | ),
45 | ),
46 | ),
47 | ),
48 | );
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/example/lib/pages/pos_format_page.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_multi_formatter/flutter_multi_formatter.dart';
3 |
4 | class PosFormatPage extends StatelessWidget {
5 | const PosFormatPage({Key? key}) : super(key: key);
6 |
7 | @override
8 | Widget build(BuildContext context) {
9 | return Unfocuser(
10 | child: Scaffold(
11 | appBar: AppBar(
12 | centerTitle: true,
13 | title: Text('Pos Formatter Demo'),
14 | ),
15 | body: SingleChildScrollView(
16 | child: Padding(
17 | padding: const EdgeInsets.all(30.0),
18 | child: Column(
19 | children: [
20 | TextFormField(
21 | decoration: InputDecoration(
22 | border: const OutlineInputBorder(),
23 | hintText: 'Enter a numeric value',
24 | hintStyle: TextStyle(
25 | color: Colors.black.withOpacity(0.3),
26 | ),
27 | errorStyle: TextStyle(
28 | color: Colors.red,
29 | ),
30 | ),
31 | keyboardType: TextInputType.number,
32 | inputFormatters: const [PosInputFormatter()],
33 | ),
34 | ],
35 | ),
36 | ),
37 | ),
38 | ),
39 | );
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/example/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://dart.dev/tools/pub/glossary#lockfile
3 | packages:
4 | async:
5 | dependency: transitive
6 | description:
7 | name: async
8 | sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
9 | url: "https://pub.dev"
10 | source: hosted
11 | version: "2.12.0"
12 | base58check:
13 | dependency: transitive
14 | description:
15 | name: base58check
16 | sha256: "6c300dfc33e598d2fe26319e13f6243fea81eaf8204cb4c6b69ef20a625319a5"
17 | url: "https://pub.dev"
18 | source: hosted
19 | version: "2.0.0"
20 | bech32:
21 | dependency: transitive
22 | description:
23 | name: bech32
24 | sha256: "156cbace936f7720c79a79d16a03efad343b1ef17106716e04b8b8e39f99f7f7"
25 | url: "https://pub.dev"
26 | source: hosted
27 | version: "0.2.2"
28 | boolean_selector:
29 | dependency: transitive
30 | description:
31 | name: boolean_selector
32 | sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
33 | url: "https://pub.dev"
34 | source: hosted
35 | version: "2.1.2"
36 | characters:
37 | dependency: transitive
38 | description:
39 | name: characters
40 | sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
41 | url: "https://pub.dev"
42 | source: hosted
43 | version: "1.4.0"
44 | clock:
45 | dependency: transitive
46 | description:
47 | name: clock
48 | sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
49 | url: "https://pub.dev"
50 | source: hosted
51 | version: "1.1.2"
52 | collection:
53 | dependency: transitive
54 | description:
55 | name: collection
56 | sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
57 | url: "https://pub.dev"
58 | source: hosted
59 | version: "1.19.1"
60 | convert:
61 | dependency: transitive
62 | description:
63 | name: convert
64 | sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
65 | url: "https://pub.dev"
66 | source: hosted
67 | version: "3.1.1"
68 | crypto:
69 | dependency: transitive
70 | description:
71 | name: crypto
72 | sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67
73 | url: "https://pub.dev"
74 | source: hosted
75 | version: "3.0.2"
76 | fake_async:
77 | dependency: transitive
78 | description:
79 | name: fake_async
80 | sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
81 | url: "https://pub.dev"
82 | source: hosted
83 | version: "1.3.2"
84 | flutter:
85 | dependency: "direct main"
86 | description: flutter
87 | source: sdk
88 | version: "0.0.0"
89 | flutter_multi_formatter:
90 | dependency: "direct main"
91 | description:
92 | path: ".."
93 | relative: true
94 | source: path
95 | version: "2.13.0"
96 | flutter_test:
97 | dependency: "direct dev"
98 | description: flutter
99 | source: sdk
100 | version: "0.0.0"
101 | leak_tracker:
102 | dependency: transitive
103 | description:
104 | name: leak_tracker
105 | sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
106 | url: "https://pub.dev"
107 | source: hosted
108 | version: "10.0.8"
109 | leak_tracker_flutter_testing:
110 | dependency: transitive
111 | description:
112 | name: leak_tracker_flutter_testing
113 | sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
114 | url: "https://pub.dev"
115 | source: hosted
116 | version: "3.0.9"
117 | leak_tracker_testing:
118 | dependency: transitive
119 | description:
120 | name: leak_tracker_testing
121 | sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
122 | url: "https://pub.dev"
123 | source: hosted
124 | version: "3.0.1"
125 | matcher:
126 | dependency: transitive
127 | description:
128 | name: matcher
129 | sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
130 | url: "https://pub.dev"
131 | source: hosted
132 | version: "0.12.17"
133 | material_color_utilities:
134 | dependency: transitive
135 | description:
136 | name: material_color_utilities
137 | sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
138 | url: "https://pub.dev"
139 | source: hosted
140 | version: "0.11.1"
141 | meta:
142 | dependency: transitive
143 | description:
144 | name: meta
145 | sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
146 | url: "https://pub.dev"
147 | source: hosted
148 | version: "1.16.0"
149 | path:
150 | dependency: transitive
151 | description:
152 | name: path
153 | sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
154 | url: "https://pub.dev"
155 | source: hosted
156 | version: "1.9.1"
157 | sky_engine:
158 | dependency: transitive
159 | description: flutter
160 | source: sdk
161 | version: "0.0.0"
162 | source_span:
163 | dependency: transitive
164 | description:
165 | name: source_span
166 | sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
167 | url: "https://pub.dev"
168 | source: hosted
169 | version: "1.10.1"
170 | stack_trace:
171 | dependency: transitive
172 | description:
173 | name: stack_trace
174 | sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
175 | url: "https://pub.dev"
176 | source: hosted
177 | version: "1.12.1"
178 | stream_channel:
179 | dependency: transitive
180 | description:
181 | name: stream_channel
182 | sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
183 | url: "https://pub.dev"
184 | source: hosted
185 | version: "2.1.4"
186 | string_scanner:
187 | dependency: transitive
188 | description:
189 | name: string_scanner
190 | sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
191 | url: "https://pub.dev"
192 | source: hosted
193 | version: "1.4.1"
194 | term_glyph:
195 | dependency: transitive
196 | description:
197 | name: term_glyph
198 | sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
199 | url: "https://pub.dev"
200 | source: hosted
201 | version: "1.2.2"
202 | test_api:
203 | dependency: transitive
204 | description:
205 | name: test_api
206 | sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
207 | url: "https://pub.dev"
208 | source: hosted
209 | version: "0.7.4"
210 | typed_data:
211 | dependency: transitive
212 | description:
213 | name: typed_data
214 | sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
215 | url: "https://pub.dev"
216 | source: hosted
217 | version: "1.3.1"
218 | vector_math:
219 | dependency: transitive
220 | description:
221 | name: vector_math
222 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
223 | url: "https://pub.dev"
224 | source: hosted
225 | version: "2.1.4"
226 | vm_service:
227 | dependency: transitive
228 | description:
229 | name: vm_service
230 | sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
231 | url: "https://pub.dev"
232 | source: hosted
233 | version: "14.3.1"
234 | sdks:
235 | dart: ">=3.7.0-0 <4.0.0"
236 | flutter: ">=3.18.0-18.0.pre.54"
237 |
--------------------------------------------------------------------------------
/example/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: example
2 | description: A new Flutter project.
3 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev
4 |
5 | # The following defines the version and build number for your application.
6 | # A version number is three numbers separated by dots, like 1.2.43
7 | # followed by an optional build number separated by a +.
8 | # Both the version and the builder number may be overridden in flutter
9 | # build by specifying --build-name and --build-number, respectively.
10 | # In Android, build-name is used as versionName while build-number used as versionCode.
11 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning
12 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
13 | # Read more about iOS versioning at
14 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
15 | version: 1.1.0+1
16 |
17 | environment:
18 | sdk: ">=2.19.0 <4.0.0"
19 | flutter: ">=2.0.0"
20 |
21 | dependencies:
22 | flutter:
23 | sdk: flutter
24 | flutter_multi_formatter:
25 | path: ../
26 |
27 | dev_dependencies:
28 | flutter_test:
29 | sdk: flutter
30 |
31 |
32 | # For information on the generic Dart part of this file, see the
33 | # following page: https://dart.dev/tools/pub/pubspec
34 |
35 | # The following section is specific to Flutter.
36 | flutter:
37 |
38 | # The following line ensures that the Material Icons font is
39 | # included with your application, so that you can use the icons in
40 | # the material Icons class.
41 | uses-material-design: true
42 |
43 | # To add assets to your application, add an assets section, like this:
44 | # assets:
45 | # - images/a_dot_burr.jpeg
46 | # - images/a_dot_ham.jpeg
47 |
48 | # An image asset can refer to one or more resolution-specific "variants", see
49 | # https://flutter.dev/assets-and-images/#resolution-aware.
50 |
51 | # For details regarding adding assets from package dependencies, see
52 | # https://flutter.dev/assets-and-images/#from-packages
53 |
54 | # For details regarding fonts from package dependencies,
55 | # see https://flutter.dev/custom-fonts/#from-packages
56 |
--------------------------------------------------------------------------------
/example/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | // This is a basic Flutter widget test.
2 | //
3 | // To perform an interaction with a widget in your test, use the WidgetTester
4 | // utility that Flutter provides. For example, you can send tap and scroll
5 | // gestures. You can also use WidgetTester to find child widgets in the widget
6 | // tree, read text, and verify that the values of widget properties are correct.
7 |
8 | import 'package:flutter/material.dart';
9 | import 'package:flutter_test/flutter_test.dart';
10 |
11 | import 'package:example/main.dart';
12 |
13 | void main() {
14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async {
15 | // Build our app and trigger a frame.
16 | await tester.pumpWidget(MyApp());
17 |
18 | // Verify that our counter starts at 0.
19 | expect(find.text('0'), findsOneWidget);
20 | expect(find.text('1'), findsNothing);
21 |
22 | // Tap the '+' icon and trigger a frame.
23 | await tester.tap(find.byIcon(Icons.add));
24 | await tester.pump();
25 |
26 | // Verify that our counter has incremented.
27 | expect(find.text('0'), findsNothing);
28 | expect(find.text('1'), findsOneWidget);
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/flags/png/ad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ad.png
--------------------------------------------------------------------------------
/flags/png/ae.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ae.png
--------------------------------------------------------------------------------
/flags/png/af.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/af.png
--------------------------------------------------------------------------------
/flags/png/ag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ag.png
--------------------------------------------------------------------------------
/flags/png/ai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ai.png
--------------------------------------------------------------------------------
/flags/png/al.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/al.png
--------------------------------------------------------------------------------
/flags/png/am.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/am.png
--------------------------------------------------------------------------------
/flags/png/an.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/an.png
--------------------------------------------------------------------------------
/flags/png/ao.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ao.png
--------------------------------------------------------------------------------
/flags/png/aq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/aq.png
--------------------------------------------------------------------------------
/flags/png/ar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ar.png
--------------------------------------------------------------------------------
/flags/png/as.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/as.png
--------------------------------------------------------------------------------
/flags/png/at.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/at.png
--------------------------------------------------------------------------------
/flags/png/au.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/au.png
--------------------------------------------------------------------------------
/flags/png/aw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/aw.png
--------------------------------------------------------------------------------
/flags/png/ax.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ax.png
--------------------------------------------------------------------------------
/flags/png/az.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/az.png
--------------------------------------------------------------------------------
/flags/png/ba.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ba.png
--------------------------------------------------------------------------------
/flags/png/bb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bb.png
--------------------------------------------------------------------------------
/flags/png/bd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bd.png
--------------------------------------------------------------------------------
/flags/png/be.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/be.png
--------------------------------------------------------------------------------
/flags/png/bf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bf.png
--------------------------------------------------------------------------------
/flags/png/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bg.png
--------------------------------------------------------------------------------
/flags/png/bh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bh.png
--------------------------------------------------------------------------------
/flags/png/bi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bi.png
--------------------------------------------------------------------------------
/flags/png/bj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bj.png
--------------------------------------------------------------------------------
/flags/png/bl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bl.png
--------------------------------------------------------------------------------
/flags/png/bm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bm.png
--------------------------------------------------------------------------------
/flags/png/bn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bn.png
--------------------------------------------------------------------------------
/flags/png/bo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bo.png
--------------------------------------------------------------------------------
/flags/png/bq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bq.png
--------------------------------------------------------------------------------
/flags/png/br.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/br.png
--------------------------------------------------------------------------------
/flags/png/bs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bs.png
--------------------------------------------------------------------------------
/flags/png/bt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bt.png
--------------------------------------------------------------------------------
/flags/png/bv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bv.png
--------------------------------------------------------------------------------
/flags/png/bw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bw.png
--------------------------------------------------------------------------------
/flags/png/by.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/by.png
--------------------------------------------------------------------------------
/flags/png/bz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/bz.png
--------------------------------------------------------------------------------
/flags/png/ca.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ca.png
--------------------------------------------------------------------------------
/flags/png/cc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cc.png
--------------------------------------------------------------------------------
/flags/png/cd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cd.png
--------------------------------------------------------------------------------
/flags/png/cf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cf.png
--------------------------------------------------------------------------------
/flags/png/cg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cg.png
--------------------------------------------------------------------------------
/flags/png/ch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ch.png
--------------------------------------------------------------------------------
/flags/png/ci.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ci.png
--------------------------------------------------------------------------------
/flags/png/ck.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ck.png
--------------------------------------------------------------------------------
/flags/png/cl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cl.png
--------------------------------------------------------------------------------
/flags/png/cm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cm.png
--------------------------------------------------------------------------------
/flags/png/cn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cn.png
--------------------------------------------------------------------------------
/flags/png/co.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/co.png
--------------------------------------------------------------------------------
/flags/png/cr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cr.png
--------------------------------------------------------------------------------
/flags/png/cu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cu.png
--------------------------------------------------------------------------------
/flags/png/cv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cv.png
--------------------------------------------------------------------------------
/flags/png/cw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cw.png
--------------------------------------------------------------------------------
/flags/png/cx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cx.png
--------------------------------------------------------------------------------
/flags/png/cy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cy.png
--------------------------------------------------------------------------------
/flags/png/cz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/cz.png
--------------------------------------------------------------------------------
/flags/png/de.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/de.png
--------------------------------------------------------------------------------
/flags/png/dj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/dj.png
--------------------------------------------------------------------------------
/flags/png/dk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/dk.png
--------------------------------------------------------------------------------
/flags/png/dm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/dm.png
--------------------------------------------------------------------------------
/flags/png/do.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/do.png
--------------------------------------------------------------------------------
/flags/png/dz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/dz.png
--------------------------------------------------------------------------------
/flags/png/ec.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ec.png
--------------------------------------------------------------------------------
/flags/png/ee.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ee.png
--------------------------------------------------------------------------------
/flags/png/eg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/eg.png
--------------------------------------------------------------------------------
/flags/png/eh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/eh.png
--------------------------------------------------------------------------------
/flags/png/er.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/er.png
--------------------------------------------------------------------------------
/flags/png/es.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/es.png
--------------------------------------------------------------------------------
/flags/png/et.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/et.png
--------------------------------------------------------------------------------
/flags/png/eu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/eu.png
--------------------------------------------------------------------------------
/flags/png/fi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/fi.png
--------------------------------------------------------------------------------
/flags/png/fj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/fj.png
--------------------------------------------------------------------------------
/flags/png/fk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/fk.png
--------------------------------------------------------------------------------
/flags/png/fm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/fm.png
--------------------------------------------------------------------------------
/flags/png/fo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/fo.png
--------------------------------------------------------------------------------
/flags/png/fr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/fr.png
--------------------------------------------------------------------------------
/flags/png/ga.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ga.png
--------------------------------------------------------------------------------
/flags/png/gb-eng.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gb-eng.png
--------------------------------------------------------------------------------
/flags/png/gb-nir.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gb-nir.png
--------------------------------------------------------------------------------
/flags/png/gb-sct.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gb-sct.png
--------------------------------------------------------------------------------
/flags/png/gb-wls.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gb-wls.png
--------------------------------------------------------------------------------
/flags/png/gb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gb.png
--------------------------------------------------------------------------------
/flags/png/gd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gd.png
--------------------------------------------------------------------------------
/flags/png/ge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ge.png
--------------------------------------------------------------------------------
/flags/png/gf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gf.png
--------------------------------------------------------------------------------
/flags/png/gg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gg.png
--------------------------------------------------------------------------------
/flags/png/gh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gh.png
--------------------------------------------------------------------------------
/flags/png/gi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gi.png
--------------------------------------------------------------------------------
/flags/png/gl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gl.png
--------------------------------------------------------------------------------
/flags/png/gm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gm.png
--------------------------------------------------------------------------------
/flags/png/gn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gn.png
--------------------------------------------------------------------------------
/flags/png/gp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gp.png
--------------------------------------------------------------------------------
/flags/png/gq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gq.png
--------------------------------------------------------------------------------
/flags/png/gr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gr.png
--------------------------------------------------------------------------------
/flags/png/gs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gs.png
--------------------------------------------------------------------------------
/flags/png/gt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gt.png
--------------------------------------------------------------------------------
/flags/png/gu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gu.png
--------------------------------------------------------------------------------
/flags/png/gw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gw.png
--------------------------------------------------------------------------------
/flags/png/gy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/gy.png
--------------------------------------------------------------------------------
/flags/png/hk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/hk.png
--------------------------------------------------------------------------------
/flags/png/hm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/hm.png
--------------------------------------------------------------------------------
/flags/png/hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/hn.png
--------------------------------------------------------------------------------
/flags/png/hr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/hr.png
--------------------------------------------------------------------------------
/flags/png/ht.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ht.png
--------------------------------------------------------------------------------
/flags/png/hu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/hu.png
--------------------------------------------------------------------------------
/flags/png/id.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/id.png
--------------------------------------------------------------------------------
/flags/png/ie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ie.png
--------------------------------------------------------------------------------
/flags/png/il.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/il.png
--------------------------------------------------------------------------------
/flags/png/im.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/im.png
--------------------------------------------------------------------------------
/flags/png/in.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/in.png
--------------------------------------------------------------------------------
/flags/png/io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/io.png
--------------------------------------------------------------------------------
/flags/png/iq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/iq.png
--------------------------------------------------------------------------------
/flags/png/ir.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ir.png
--------------------------------------------------------------------------------
/flags/png/is.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/is.png
--------------------------------------------------------------------------------
/flags/png/it.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/it.png
--------------------------------------------------------------------------------
/flags/png/je.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/je.png
--------------------------------------------------------------------------------
/flags/png/jm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/jm.png
--------------------------------------------------------------------------------
/flags/png/jo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/jo.png
--------------------------------------------------------------------------------
/flags/png/jp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/jp.png
--------------------------------------------------------------------------------
/flags/png/ke.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ke.png
--------------------------------------------------------------------------------
/flags/png/kg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/kg.png
--------------------------------------------------------------------------------
/flags/png/kh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/kh.png
--------------------------------------------------------------------------------
/flags/png/ki.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ki.png
--------------------------------------------------------------------------------
/flags/png/km.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/km.png
--------------------------------------------------------------------------------
/flags/png/kn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/kn.png
--------------------------------------------------------------------------------
/flags/png/kp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/kp.png
--------------------------------------------------------------------------------
/flags/png/kr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/kr.png
--------------------------------------------------------------------------------
/flags/png/kw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/kw.png
--------------------------------------------------------------------------------
/flags/png/ky.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ky.png
--------------------------------------------------------------------------------
/flags/png/kz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/kz.png
--------------------------------------------------------------------------------
/flags/png/la.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/la.png
--------------------------------------------------------------------------------
/flags/png/lb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/lb.png
--------------------------------------------------------------------------------
/flags/png/lc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/lc.png
--------------------------------------------------------------------------------
/flags/png/li.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/li.png
--------------------------------------------------------------------------------
/flags/png/lk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/lk.png
--------------------------------------------------------------------------------
/flags/png/lr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/lr.png
--------------------------------------------------------------------------------
/flags/png/ls.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ls.png
--------------------------------------------------------------------------------
/flags/png/lt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/lt.png
--------------------------------------------------------------------------------
/flags/png/lu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/lu.png
--------------------------------------------------------------------------------
/flags/png/lv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/lv.png
--------------------------------------------------------------------------------
/flags/png/ly.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ly.png
--------------------------------------------------------------------------------
/flags/png/ma.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ma.png
--------------------------------------------------------------------------------
/flags/png/mc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mc.png
--------------------------------------------------------------------------------
/flags/png/md.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/md.png
--------------------------------------------------------------------------------
/flags/png/me.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/me.png
--------------------------------------------------------------------------------
/flags/png/mf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mf.png
--------------------------------------------------------------------------------
/flags/png/mg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mg.png
--------------------------------------------------------------------------------
/flags/png/mh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mh.png
--------------------------------------------------------------------------------
/flags/png/mk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mk.png
--------------------------------------------------------------------------------
/flags/png/ml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ml.png
--------------------------------------------------------------------------------
/flags/png/mm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mm.png
--------------------------------------------------------------------------------
/flags/png/mn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mn.png
--------------------------------------------------------------------------------
/flags/png/mo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mo.png
--------------------------------------------------------------------------------
/flags/png/mp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mp.png
--------------------------------------------------------------------------------
/flags/png/mq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mq.png
--------------------------------------------------------------------------------
/flags/png/mr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mr.png
--------------------------------------------------------------------------------
/flags/png/ms.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ms.png
--------------------------------------------------------------------------------
/flags/png/mt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mt.png
--------------------------------------------------------------------------------
/flags/png/mu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mu.png
--------------------------------------------------------------------------------
/flags/png/mv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mv.png
--------------------------------------------------------------------------------
/flags/png/mw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mw.png
--------------------------------------------------------------------------------
/flags/png/mx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mx.png
--------------------------------------------------------------------------------
/flags/png/my.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/my.png
--------------------------------------------------------------------------------
/flags/png/mz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/mz.png
--------------------------------------------------------------------------------
/flags/png/na.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/na.png
--------------------------------------------------------------------------------
/flags/png/nc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/nc.png
--------------------------------------------------------------------------------
/flags/png/ne.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ne.png
--------------------------------------------------------------------------------
/flags/png/nf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/nf.png
--------------------------------------------------------------------------------
/flags/png/ng.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ng.png
--------------------------------------------------------------------------------
/flags/png/ni.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ni.png
--------------------------------------------------------------------------------
/flags/png/nl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/nl.png
--------------------------------------------------------------------------------
/flags/png/no.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/no.png
--------------------------------------------------------------------------------
/flags/png/np.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/np.png
--------------------------------------------------------------------------------
/flags/png/nr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/nr.png
--------------------------------------------------------------------------------
/flags/png/nu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/nu.png
--------------------------------------------------------------------------------
/flags/png/nz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/nz.png
--------------------------------------------------------------------------------
/flags/png/om.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/om.png
--------------------------------------------------------------------------------
/flags/png/pa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pa.png
--------------------------------------------------------------------------------
/flags/png/pe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pe.png
--------------------------------------------------------------------------------
/flags/png/pf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pf.png
--------------------------------------------------------------------------------
/flags/png/pg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pg.png
--------------------------------------------------------------------------------
/flags/png/ph.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ph.png
--------------------------------------------------------------------------------
/flags/png/pk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pk.png
--------------------------------------------------------------------------------
/flags/png/pl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pl.png
--------------------------------------------------------------------------------
/flags/png/pm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pm.png
--------------------------------------------------------------------------------
/flags/png/pn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pn.png
--------------------------------------------------------------------------------
/flags/png/pr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pr.png
--------------------------------------------------------------------------------
/flags/png/ps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ps.png
--------------------------------------------------------------------------------
/flags/png/pt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pt.png
--------------------------------------------------------------------------------
/flags/png/pw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/pw.png
--------------------------------------------------------------------------------
/flags/png/py.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/py.png
--------------------------------------------------------------------------------
/flags/png/qa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/qa.png
--------------------------------------------------------------------------------
/flags/png/re.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/re.png
--------------------------------------------------------------------------------
/flags/png/ro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ro.png
--------------------------------------------------------------------------------
/flags/png/rs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/rs.png
--------------------------------------------------------------------------------
/flags/png/ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ru.png
--------------------------------------------------------------------------------
/flags/png/rw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/rw.png
--------------------------------------------------------------------------------
/flags/png/sa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sa.png
--------------------------------------------------------------------------------
/flags/png/sb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sb.png
--------------------------------------------------------------------------------
/flags/png/sc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sc.png
--------------------------------------------------------------------------------
/flags/png/sd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sd.png
--------------------------------------------------------------------------------
/flags/png/se.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/se.png
--------------------------------------------------------------------------------
/flags/png/sg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sg.png
--------------------------------------------------------------------------------
/flags/png/sh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sh.png
--------------------------------------------------------------------------------
/flags/png/si.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/si.png
--------------------------------------------------------------------------------
/flags/png/sj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sj.png
--------------------------------------------------------------------------------
/flags/png/sk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sk.png
--------------------------------------------------------------------------------
/flags/png/sl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sl.png
--------------------------------------------------------------------------------
/flags/png/sm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sm.png
--------------------------------------------------------------------------------
/flags/png/sn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sn.png
--------------------------------------------------------------------------------
/flags/png/so.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/so.png
--------------------------------------------------------------------------------
/flags/png/sr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sr.png
--------------------------------------------------------------------------------
/flags/png/ss.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ss.png
--------------------------------------------------------------------------------
/flags/png/st.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/st.png
--------------------------------------------------------------------------------
/flags/png/sv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sv.png
--------------------------------------------------------------------------------
/flags/png/sx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sx.png
--------------------------------------------------------------------------------
/flags/png/sy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sy.png
--------------------------------------------------------------------------------
/flags/png/sz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/sz.png
--------------------------------------------------------------------------------
/flags/png/tc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tc.png
--------------------------------------------------------------------------------
/flags/png/td.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/td.png
--------------------------------------------------------------------------------
/flags/png/tf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tf.png
--------------------------------------------------------------------------------
/flags/png/tg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tg.png
--------------------------------------------------------------------------------
/flags/png/th.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/th.png
--------------------------------------------------------------------------------
/flags/png/tj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tj.png
--------------------------------------------------------------------------------
/flags/png/tk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tk.png
--------------------------------------------------------------------------------
/flags/png/tl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tl.png
--------------------------------------------------------------------------------
/flags/png/tm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tm.png
--------------------------------------------------------------------------------
/flags/png/tn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tn.png
--------------------------------------------------------------------------------
/flags/png/to.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/to.png
--------------------------------------------------------------------------------
/flags/png/tr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tr.png
--------------------------------------------------------------------------------
/flags/png/tt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tt.png
--------------------------------------------------------------------------------
/flags/png/tv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tv.png
--------------------------------------------------------------------------------
/flags/png/tw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tw.png
--------------------------------------------------------------------------------
/flags/png/tz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/tz.png
--------------------------------------------------------------------------------
/flags/png/ua.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ua.png
--------------------------------------------------------------------------------
/flags/png/ug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ug.png
--------------------------------------------------------------------------------
/flags/png/um.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/um.png
--------------------------------------------------------------------------------
/flags/png/us.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/us.png
--------------------------------------------------------------------------------
/flags/png/uy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/uy.png
--------------------------------------------------------------------------------
/flags/png/uz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/uz.png
--------------------------------------------------------------------------------
/flags/png/va.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/va.png
--------------------------------------------------------------------------------
/flags/png/vc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/vc.png
--------------------------------------------------------------------------------
/flags/png/ve.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ve.png
--------------------------------------------------------------------------------
/flags/png/vg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/vg.png
--------------------------------------------------------------------------------
/flags/png/vi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/vi.png
--------------------------------------------------------------------------------
/flags/png/vn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/vn.png
--------------------------------------------------------------------------------
/flags/png/vu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/vu.png
--------------------------------------------------------------------------------
/flags/png/wf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/wf.png
--------------------------------------------------------------------------------
/flags/png/ws.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ws.png
--------------------------------------------------------------------------------
/flags/png/xk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/xk.png
--------------------------------------------------------------------------------
/flags/png/ye.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/ye.png
--------------------------------------------------------------------------------
/flags/png/yt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/yt.png
--------------------------------------------------------------------------------
/flags/png/za.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/za.png
--------------------------------------------------------------------------------
/flags/png/zm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/zm.png
--------------------------------------------------------------------------------
/flags/png/zw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/caseyryan/flutter_multi_formatter/315d478671ec355d0bdd2f00410b59bc52f5e52e/flags/png/zw.png
--------------------------------------------------------------------------------
/lib/extensions/double_extensions.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/foundation.dart';
2 |
3 | extension DoubleExtensions on double {
4 | String toStringAsSmartRound({
5 | int maxPrecision = 2,
6 | }) {
7 | final str = toString();
8 | try {
9 | if (str.contains('.')) {
10 | final split = str.split('');
11 | final mantissa = [];
12 | final periodIndex = str.indexOf('.');
13 | final wholePart = str.substring(0, periodIndex);
14 | int numChars = 0;
15 | for (var i = periodIndex + 1; i < str.length; i++) {
16 | if (numChars >= maxPrecision) {
17 | break;
18 | }
19 | final char = split[i];
20 | // if (char == '0') {
21 | // break;
22 | // } else {
23 | mantissa.add(char);
24 | // }
25 | numChars++;
26 | }
27 | if (mantissa.isNotEmpty) {
28 | int i = mantissa.length - 1;
29 | while (mantissa.isNotEmpty) {
30 | if (mantissa[i] != '0') {
31 | break;
32 | }
33 | i--;
34 | mantissa.removeLast();
35 | }
36 | if (mantissa.isNotEmpty) {
37 | return '$wholePart.${mantissa.join()}';
38 | }
39 | }
40 | return wholePart;
41 | }
42 | } catch (e) {
43 | if (kDebugMode) {
44 | print(e);
45 | }
46 | }
47 | return str;
48 | }
49 |
50 | int toSafeInt({
51 | int? minValue,
52 | int? maxValue,
53 | }) {
54 | if (minValue == null && maxValue == null) {
55 | return toInt();
56 | }
57 | if (minValue != null) {
58 | if (this < minValue) {
59 | return minValue;
60 | }
61 | }
62 | if (maxValue != null) {
63 | if (this > maxValue) {
64 | return maxValue;
65 | }
66 | }
67 | return toInt();
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/lib/extensions/exports.dart:
--------------------------------------------------------------------------------
1 | export 'double_extensions.dart';
2 | export 'int_extensions.dart';
3 | export 'string_extensions.dart';
4 |
--------------------------------------------------------------------------------
/lib/extensions/int_extensions.dart:
--------------------------------------------------------------------------------
1 | extension IntExtension on int {
2 | int subtractClamping(
3 | int subtract, {
4 | int minValue = 0,
5 | int maxValue = 999999999,
6 | }) {
7 | return (this - subtract).clamp(
8 | minValue,
9 | maxValue,
10 | );
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/lib/extensions/string_extensions.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_multi_formatter/flutter_multi_formatter.dart';
2 |
3 | extension StringExtension on String {
4 | String removeCharAt(int charIndex) {
5 | final charList = split('').toList();
6 | charList.removeAt(charIndex);
7 | return charList.join('');
8 | }
9 |
10 | String toPhoneNumber({
11 | InvalidPhoneAction invalidPhoneAction = InvalidPhoneAction.ShowUnformatted,
12 | bool allowEndlessPhone = false,
13 | String? defaultMask,
14 | String? defaultCountryCode,
15 | }) {
16 | return formatAsPhoneNumber(
17 | this,
18 | allowEndlessPhone: allowEndlessPhone,
19 | defaultCountryCode: defaultCountryCode,
20 | defaultMask: defaultMask,
21 | invalidPhoneAction: invalidPhoneAction,
22 | ) ??
23 | this;
24 | }
25 |
26 | String toCardNumber() {
27 | return formatAsCardNumber(this);
28 | }
29 |
30 | bool isValidCardNumber({
31 | bool checkLength = false,
32 | bool useLuhnAlgo = true,
33 | }) {
34 | return isCardNumberValid(
35 | cardNumber: this,
36 | useLuhnAlgo: useLuhnAlgo,
37 | checkLength: checkLength,
38 | );
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/lib/flutter_multi_formatter.dart:
--------------------------------------------------------------------------------
1 | /*
2 | (c) Copyright 2019 Serov Konstantin.
3 |
4 | Licensed under the MIT license:
5 |
6 | http://www.opensource.org/licenses/mit-license.php
7 |
8 | Permission is hereby granted, free of charge, to any person obtaining a copy
9 | of this software and associated documentation files (the "Software"), to deal
10 | in the Software without restriction, including without limitation the rights
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | copies of the Software, and to permit persons to whom the Software is
13 | furnished to do so, subject to the following conditions:
14 |
15 | The above copyright notice and this permission notice shall be included in
16 | all copies or substantial portions of the Software.
17 |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | THE SOFTWARE.
25 | */
26 |
27 | library flutter_multi_formatter;
28 |
29 | export 'extensions/exports.dart';
30 | export 'formatters/credit_card_cvc_input_formatter.dart';
31 | export 'formatters/credit_card_expiration_input_formatter.dart';
32 | export 'formatters/credit_card_number_input_formatter.dart';
33 | export 'formatters/currency_input_formatter.dart';
34 | export 'formatters/formatter_extension_methods.dart';
35 | export 'formatters/formatter_utils.dart';
36 | export 'formatters/masked_input_formatter.dart';
37 | export 'formatters/money_input_enums.dart';
38 | export 'formatters/money_input_formatter.dart';
39 | export 'formatters/phone_input_enums.dart';
40 | export 'formatters/phone_input_formatter.dart';
41 | export 'formatters/pinyin_formatter.dart';
42 | export 'formatters/pos_input_formatter.dart';
43 | export 'utils/bitcoin_validator/bitcoin_validator.dart';
44 | export 'utils/bitcoin_validator/bitcoin_wallet_details.dart';
45 | export 'utils/enum_utils.dart';
46 | export 'utils/unfocuser.dart';
47 | export 'widgets/country_dropdown.dart';
48 |
--------------------------------------------------------------------------------
/lib/formatters/all_fiat_currencies.dart:
--------------------------------------------------------------------------------
1 | const allFiatCurrencies = const [
2 | 'CNY',
3 | 'USD',
4 | 'EUR',
5 | 'JPY',
6 | 'GBP',
7 | 'KRW',
8 | 'INR',
9 | 'CAD',
10 | 'HKD',
11 | 'BRL',
12 | 'AUD',
13 | 'TWD',
14 | 'RUB',
15 | 'CHF',
16 | 'MXN',
17 | 'SAR',
18 | 'THB',
19 | 'AED',
20 | 'SGD',
21 | 'VND',
22 | 'IDR',
23 | 'ILS',
24 | 'MYR',
25 | 'SEK',
26 | 'PLN',
27 | 'TRY',
28 | 'CLP',
29 | 'NOK',
30 | 'PHP',
31 | 'ZAR',
32 | 'EGP',
33 | 'DKK',
34 | 'CZK',
35 | 'NZD',
36 | 'QAR',
37 | 'COP',
38 | 'MAD',
39 | 'PKR',
40 | 'LBP',
41 | 'KWD',
42 | 'RON',
43 | 'NGN',
44 | 'ARS',
45 | 'IQD',
46 | 'HUF',
47 | 'MOP',
48 | 'PEN',
49 | 'BGN',
50 | 'KZT',
51 | 'UAH',
52 | 'JOD',
53 | 'OMR',
54 | 'GTQ',
55 | 'BHD',
56 | 'DOP',
57 | 'XOF',
58 | 'KES',
59 | 'BOB',
60 | 'RSD',
61 | 'LKR',
62 | 'HRK',
63 | 'AZN',
64 | 'AOA',
65 | 'HNL',
66 | 'BYN',
67 | 'CRC',
68 | 'LYD',
69 | 'MUR',
70 | 'ISK',
71 | 'PYG',
72 | 'TZS',
73 | 'TTD',
74 | 'ALL',
75 | 'CDF',
76 | 'GEL',
77 | 'BND',
78 | 'UYU',
79 | 'MZN',
80 | 'BSD',
81 | 'UGX',
82 | 'MNT',
83 | 'LAK',
84 | 'SDG',
85 | 'BWP',
86 | 'NAD',
87 | 'BAM',
88 | 'MKD',
89 | 'AMD',
90 | 'MDL',
91 | 'XPF',
92 | 'JMD',
93 | 'NIO',
94 | 'GNF',
95 | 'MGA',
96 | 'KGS',
97 | 'MVR',
98 | 'RWF',
99 | 'GYD',
100 | 'BTN',
101 | 'CVE',
102 | 'SCR',
103 | 'XAF',
104 | 'BIF',
105 | 'SZL',
106 | 'GMD',
107 | 'LRD',
108 | 'SLL',
109 | 'LSL',
110 | 'KMF',
111 | 'BDT',
112 | 'TND',
113 | 'ZMK',
114 | 'TJS',
115 | 'MWK',
116 | 'STD',
117 | ];
118 |
--------------------------------------------------------------------------------
/lib/formatters/credit_card_cvc_input_formatter.dart:
--------------------------------------------------------------------------------
1 | /*
2 | (c) Copyright 2020 Serov Konstantin.
3 |
4 | Licensed under the MIT license:
5 |
6 | http://www.opensource.org/licenses/mit-license.php
7 |
8 | Permission is hereby granted, free of charge, to any person obtaining a copy
9 | of this software and associated documentation files (the "Software"), to deal
10 | in the Software without restriction, including without limitation the rights
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | copies of the Software, and to permit persons to whom the Software is
13 | furnished to do so, subject to the following conditions:
14 |
15 | The above copyright notice and this permission notice shall be included in
16 | all copies or substantial portions of the Software.
17 |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | THE SOFTWARE.
25 | */
26 |
27 | import 'package:flutter_multi_formatter/formatters/masked_input_formatter.dart';
28 |
29 | class CreditCardCvcInputFormatter extends MaskedInputFormatter {
30 | CreditCardCvcInputFormatter({bool isAmericanExpress = false})
31 | : super(
32 | isAmericanExpress ? '0000' : '000',
33 | );
34 | }
35 |
--------------------------------------------------------------------------------
/lib/formatters/credit_card_expiration_input_formatter.dart:
--------------------------------------------------------------------------------
1 | /*
2 | (c) Copyright 2020 Serov Konstantin.
3 |
4 | Licensed under the MIT license:
5 |
6 | http://www.opensource.org/licenses/mit-license.php
7 |
8 | Permission is hereby granted, free of charge, to any person obtaining a copy
9 | of this software and associated documentation files (the "Software"), to deal
10 | in the Software without restriction, including without limitation the rights
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | copies of the Software, and to permit persons to whom the Software is
13 | furnished to do so, subject to the following conditions:
14 |
15 | The above copyright notice and this permission notice shall be included in
16 | all copies or substantial portions of the Software.
17 |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | THE SOFTWARE.
25 | */
26 |
27 | import 'formatter_utils.dart';
28 | import 'masked_input_formatter.dart';
29 |
30 | class CreditCardExpirationDateFormatter extends MaskedInputFormatter {
31 | CreditCardExpirationDateFormatter() : super('00/00');
32 |
33 | @override
34 | FormattedValue applyMask(String text) {
35 | var fv = super.applyMask(text);
36 | var result = fv.toString();
37 | var numericString = toNumericString(
38 | result,
39 | allowAllZeroes: true,
40 | );
41 | var numAddedLeadingSymbols = 0;
42 | String? amendedMonth;
43 | if (numericString.length > 0) {
44 | var allDigits = numericString.split('');
45 | var stringBuffer = StringBuffer();
46 | var firstDigit = int.parse(allDigits[0]);
47 |
48 | if (firstDigit > 1) {
49 | stringBuffer.write('0');
50 | stringBuffer.write(firstDigit);
51 | amendedMonth = stringBuffer.toString();
52 | numAddedLeadingSymbols = 1;
53 | } else if (firstDigit == 1) {
54 | if (allDigits.length > 1) {
55 | stringBuffer.write(firstDigit);
56 | var secondDigit = int.parse(allDigits[1]);
57 | if (secondDigit > 2) {
58 | stringBuffer.write(2);
59 | } else {
60 | stringBuffer.write(secondDigit);
61 | }
62 | amendedMonth = stringBuffer.toString();
63 | }
64 | }
65 | }
66 | if (amendedMonth != null) {
67 | if (result.length < amendedMonth.length) {
68 | result = amendedMonth;
69 | } else {
70 | var sub = result.substring(2, result.length);
71 | result = '$amendedMonth$sub';
72 | }
73 | }
74 | fv = super.applyMask(result);
75 |
76 | /// a little hack to be able to move caret by one
77 | /// symbol to the right if a leading zero was added automatically
78 | for (var i = 0; i < numAddedLeadingSymbols; i++) {
79 | fv.increaseNumberOfLeadingSymbols();
80 | }
81 | return fv;
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/lib/formatters/formatter_extension_methods.dart:
--------------------------------------------------------------------------------
1 | /*
2 | (c) Copyright 2020 Serov Konstantin.
3 |
4 | Licensed under the MIT license:
5 |
6 | http://www.opensource.org/licenses/mit-license.php
7 |
8 | Permission is hereby granted, free of charge, to any person obtaining a copy
9 | of this software and associated documentation files (the "Software"), to deal
10 | in the Software without restriction, including without limitation the rights
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | copies of the Software, and to permit persons to whom the Software is
13 | furnished to do so, subject to the following conditions:
14 |
15 | The above copyright notice and this permission notice shall be included in
16 | all copies or substantial portions of the Software.
17 |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | THE SOFTWARE.
25 | */
26 |
27 | import 'currency_input_formatter.dart';
28 | import 'formatter_utils.dart' as fu;
29 | import 'money_input_enums.dart';
30 |
31 | /// WARNING! This stuff requires Dart SDK version 2.6+
32 | /// so if your code is supposed to be running on
33 | /// older versions do not use these methods!
34 | /// or change the sdk restrictions in your pubspec.yaml like this:
35 | /// environment:
36 | /// sdk: ">=2.6.0 <3.0.0"
37 |
38 | extension NumericInputFormatting on num {
39 | /// [thousandSeparator] specifies what symbol will be used to separate
40 | /// each block of 3 digits, e.g. [ThousandSeparator.Comma] will format
41 | /// a million as 1,000,000
42 | /// [shorteningPolicy] is used to round values using K for thousands, M for
43 | /// millions and B for billions
44 | /// [ShorteningPolicy.NoShortening] displays a value of 1234456789.34 as 1,234,456,789.34
45 | /// but [ShorteningPolicy.RoundToThousands] displays the same value as 1,234,456K
46 | /// [mantissaLength] specifies how many digits will be added after a period sign
47 | /// [leadingSymbol] any symbol (except for the ones that contain digits) the will be
48 | /// added in front of the resulting string. E.g. $ or €
49 | /// some of the signs are available via constants like [CurrencySymbols.EURO_SIGN]
50 | /// but you can basically add any string instead of it. The main rule is that the string
51 | /// must not contain digits, periods, commas and dashes
52 | /// [trailingSymbol] is the same as leading but this symbol will be added at the
53 | /// end of your resulting string like 1,250€ instead of €1,250
54 | /// [useSymbolPadding] adds a space between the number and trailing / leading symbols
55 | /// like 1,250€ -> 1,250 € or €1,250€ -> € 1,250
56 | String toCurrencyString({
57 | int mantissaLength = 2,
58 | ThousandSeparator thousandSeparator = ThousandSeparator.Comma,
59 | ShorteningPolicy shorteningPolicy = ShorteningPolicy.NoShortening,
60 | String leadingSymbol = '',
61 | String trailingSymbol = '',
62 | bool useSymbolPadding = false,
63 | }) {
64 | return fu.toCurrencyString(
65 | this.toString(),
66 | mantissaLength: mantissaLength,
67 | leadingSymbol: leadingSymbol,
68 | shorteningPolicy: shorteningPolicy,
69 | thousandSeparator: thousandSeparator,
70 | trailingSymbol: trailingSymbol,
71 | useSymbolPadding: useSymbolPadding,
72 | );
73 | }
74 | }
75 |
76 | extension StringInputFormatting on String {
77 | bool get isFiatCurrency {
78 | return fu.isFiatCurrency(this);
79 | }
80 |
81 | bool get isCryptoCurrency {
82 | return fu.isCryptoCurrency(this);
83 | }
84 |
85 | String reverse() {
86 | return split('').reversed.join();
87 | }
88 |
89 | String removeLast() {
90 | if (isEmpty) return this;
91 | return substring(0, length - 1);
92 | }
93 |
94 | /// [thousandSeparator] specifies what symbol will be used to separate
95 | /// each block of 3 digits, e.g. [ThousandSeparator.Comma] will format
96 | /// a million as 1,000,000
97 | /// [shorteningPolicy] is used to round values using K for thousands, M for
98 | /// millions and B for billions
99 | /// [ShorteningPolicy.NoShortening] displays a value of 1234456789.34 as 1,234,456,789.34
100 | /// but [ShorteningPolicy.RoundToThousands] displays the same value as 1,234,456K
101 | /// [mantissaLength] specifies how many digits will be added after a period sign
102 | /// [leadingSymbol] any symbol (except for the ones that contain digits) the will be
103 | /// added in front of the resulting string. E.g. $ or €
104 | /// some of the signs are available via constants like [MoneyInputFormatter.EURO_SIGN]
105 | /// but you can basically add any string instead of it. The main rule is that the string
106 | /// must not contain digits, periods, commas and dashes
107 | /// [trailingSymbol] is the same as leading but this symbol will be added at the
108 | /// end of your resulting string like 1,250€ instead of €1,250
109 | /// [useSymbolPadding] adds a space between the number and trailing / leading symbols
110 | /// like 1,250€ -> 1,250 € or €1,250€ -> € 1,250
111 | String toCurrencyString({
112 | int mantissaLength = 2,
113 | ThousandSeparator thousandSeparator = ThousandSeparator.Comma,
114 | ShorteningPolicy shorteningPolicy = ShorteningPolicy.NoShortening,
115 | String leadingSymbol = '',
116 | String trailingSymbol = '',
117 | bool useSymbolPadding = false,
118 | }) {
119 | return fu.toCurrencyString(
120 | toString(),
121 | mantissaLength: mantissaLength,
122 | leadingSymbol: leadingSymbol,
123 | shorteningPolicy: shorteningPolicy,
124 | thousandSeparator: thousandSeparator,
125 | trailingSymbol: trailingSymbol,
126 | useSymbolPadding: useSymbolPadding,
127 | );
128 | }
129 | }
130 |
--------------------------------------------------------------------------------
/lib/formatters/money_input_enums.dart:
--------------------------------------------------------------------------------
1 | /*
2 | (c) Copyright 2020 Serov Konstantin.
3 |
4 | Licensed under the MIT license:
5 |
6 | http://www.opensource.org/licenses/mit-license.php
7 |
8 | Permission is hereby granted, free of charge, to any person obtaining a copy
9 | of this software and associated documentation files (the "Software"), to deal
10 | in the Software without restriction, including without limitation the rights
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | copies of the Software, and to permit persons to whom the Software is
13 | furnished to do so, subject to the following conditions:
14 |
15 | The above copyright notice and this permission notice shall be included in
16 | all copies or substantial portions of the Software.
17 |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | THE SOFTWARE.
25 | */
26 |
27 | enum ShorteningPolicy {
28 | /// displays a value of 1234456789.34 as 1,234,456,789.34
29 | NoShortening,
30 |
31 | /// displays a value of 1234456789.34 as 1,234,456K
32 | RoundToThousands,
33 |
34 | /// displays a value of 1234456789.34 as 1,234M
35 | RoundToMillions,
36 |
37 | /// displays a value of 1234456789.34 as 1B
38 | RoundToBillions,
39 | RoundToTrillions,
40 |
41 | /// uses K, M, B, or T depending on how big the numeric value is
42 | Automatic
43 | }
44 |
45 | /// [Comma] means this format 1,000,000.00
46 | /// [Period] means thousands and mantissa will look like this
47 | /// 1.000.000,00
48 | /// [None] no separator will be applied at all
49 | /// [SpaceAndPeriodMantissa] 1 000 000.00
50 | /// [SpaceAndCommaMantissa] 1 000 000,00
51 | enum ThousandSeparator {
52 | Comma,
53 | Space,
54 | Period,
55 | None,
56 | SpaceAndPeriodMantissa,
57 | SpaceAndCommaMantissa,
58 | }
59 |
--------------------------------------------------------------------------------
/lib/formatters/phone_input_enums.dart:
--------------------------------------------------------------------------------
1 | /*
2 | (c) Copyright 2020 Serov Konstantin.
3 |
4 | Licensed under the MIT license:
5 |
6 | http://www.opensource.org/licenses/mit-license.php
7 |
8 | Permission is hereby granted, free of charge, to any person obtaining a copy
9 | of this software and associated documentation files (the "Software"), to deal
10 | in the Software without restriction, including without limitation the rights
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | copies of the Software, and to permit persons to whom the Software is
13 | furnished to do so, subject to the following conditions:
14 |
15 | The above copyright notice and this permission notice shall be included in
16 | all copies or substantial portions of the Software.
17 |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | THE SOFTWARE.
25 | */
26 |
27 | /// this is used in a formatAsPhoneNumber() function
28 | /// and this is what the returned result depends on
29 | enum InvalidPhoneAction {
30 | ShowUnformatted,
31 | ReturnNull,
32 | ShowPhoneInvalidString,
33 | DoNothing,
34 | }
35 |
--------------------------------------------------------------------------------
/lib/formatters/pinyin_formatter.dart:
--------------------------------------------------------------------------------
1 | import 'dart:math';
2 |
3 | import 'package:flutter/services.dart';
4 | import 'package:flutter_multi_formatter/flutter_multi_formatter.dart';
5 | import 'package:flutter_multi_formatter/utils/pinyin_utils.dart';
6 |
7 | class PinyinFormatter implements TextInputFormatter {
8 | static final RegExp _apostropheRegexp = RegExp('\'');
9 | static final RegExp _badApostrophes = RegExp(r"[’']+");
10 |
11 | final String? replacementForSpace;
12 |
13 | /// [replacementForSpace] in case you need to replace
14 | /// a space with something, just pass it here
15 | const PinyinFormatter({
16 | this.replacementForSpace,
17 | });
18 |
19 | int _countSeparators(String value) {
20 | return _apostropheRegexp.allMatches(value).length;
21 | }
22 |
23 | @override
24 | TextEditingValue formatEditUpdate(
25 | TextEditingValue oldValue,
26 | TextEditingValue newValue,
27 | ) {
28 | final numOldSeparatos = _countSeparators(
29 | oldValue.text,
30 | );
31 | String initialText = newValue.text;
32 | String newText = newValue.text.replaceAll(_badApostrophes, '');
33 | if (replacementForSpace != null) {
34 | initialText = initialText.replaceAll(' ', replacementForSpace!);
35 | newText = newText.replaceAll(' ', replacementForSpace!);
36 | }
37 | final syllables = PinyinUtils.splitToSyllables(
38 | newText.trim(),
39 | );
40 | newText = syllables.map((e) => e.value).join('\'');
41 | if (newText.isEmpty) {
42 | newText = initialText;
43 | }
44 | if (newText.endsWith('\'')) {
45 | newText = newText.removeLast();
46 | }
47 | final numNewSeparatos = _countSeparators(
48 | newText,
49 | );
50 | final offset = newValue.selection.end + (numNewSeparatos - numOldSeparatos);
51 | return newValue.copyWith(
52 | text: newText,
53 | selection: TextSelection.collapsed(
54 | offset: min(offset, newText.length),
55 | ),
56 | );
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/lib/formatters/pos_input_formatter.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/services.dart';
2 |
3 | class PosInputFormatter implements TextInputFormatter {
4 | final DecimalPosSeparator decimalSeparator;
5 | final ThousandsPosSeparator? thousandsSeparator;
6 | final int mantissaLength;
7 |
8 | /// [decimalSeparator] specifies what symbol will be used to separate
9 | /// integer part between decimal part, e.g. [ThousandsPosSeparator.comma]
10 | /// will format ten point thirteen as 10.13
11 | /// [thousandsSeparator] specifies what symbol will be used to separate
12 | /// each block of 3 digits, e.g. [ThousandsPosSeparator.comma] will format
13 | /// million as 1,000,000
14 | /// [mantissaLength] specifies how many digits will be added after a period sign
15 | const PosInputFormatter({
16 | this.decimalSeparator = DecimalPosSeparator.dot,
17 | this.thousandsSeparator,
18 | this.mantissaLength = 2,
19 | });
20 |
21 | String insertThousandSeparator(
22 | String text,
23 | String separator,
24 | ) {
25 | final textLength = text.length;
26 | final textBuffer = [];
27 |
28 | for (var i = 0; i < textLength; i++) {
29 | if (i % 3 == 0 && i != 0) {
30 | textBuffer.add(separator);
31 | }
32 | textBuffer.add(text[textLength - i - 1]);
33 | }
34 |
35 | return textBuffer.reversed.join();
36 | }
37 |
38 | @override
39 | TextEditingValue formatEditUpdate(
40 | TextEditingValue oldValue,
41 | TextEditingValue newValue,
42 | ) {
43 | var text = newValue.text;
44 |
45 | // Clean text
46 | text = text.replaceAll(
47 | RegExp(r"[^0-9]"),
48 | '',
49 | );
50 |
51 | // Remove initial zero
52 | text = text.replaceFirst(
53 | RegExp(r'0*'),
54 | '',
55 | );
56 |
57 | // Add the zeros until you get to the whole part
58 | if (text.length <= mantissaLength)
59 | text = text.padLeft(
60 | mantissaLength + 1,
61 | '0',
62 | );
63 |
64 | if (text.length > mantissaLength) {
65 | final separatorOffset = text.length - mantissaLength;
66 |
67 | var integerPart = text.substring(
68 | 0,
69 | separatorOffset,
70 | );
71 | final decimalPart = text.substring(
72 | separatorOffset,
73 | text.length,
74 | );
75 |
76 | if (thousandsSeparator != null) {
77 | integerPart = insertThousandSeparator(
78 | integerPart,
79 | thousandsSeparator!.char,
80 | );
81 | }
82 |
83 | text = '$integerPart${decimalSeparator.char}$decimalPart';
84 |
85 | return newValue.copyWith(
86 | selection: TextSelection.collapsed(
87 | offset: text.length,
88 | ),
89 | text: text,
90 | );
91 | }
92 |
93 | return newValue.copyWith(
94 | selection: TextSelection.collapsed(
95 | offset: text.length,
96 | ),
97 | text: text,
98 | );
99 | }
100 | }
101 |
102 | class DecimalPosSeparator {
103 | final String char;
104 |
105 | const DecimalPosSeparator._(this.char);
106 |
107 | factory DecimalPosSeparator.parse(
108 | String char,
109 | ) {
110 | switch (char) {
111 | case ',':
112 | return comma;
113 | case '.':
114 | return dot;
115 | }
116 |
117 | throw FormatException(
118 | "Invalid char. Valid characters: $values",
119 | char,
120 | );
121 | }
122 |
123 | /// [comma] means this format 1000000.00
124 | static const DecimalPosSeparator dot = DecimalPosSeparator._('.');
125 |
126 | /// [comma] means this format 1000000,00
127 | static const DecimalPosSeparator comma = DecimalPosSeparator._(',');
128 |
129 | /// All decimal pos separators
130 | static List get values => const [comma, dot];
131 |
132 | @override
133 | String toString() => '$runtimeType.$char';
134 | }
135 |
136 | class ThousandsPosSeparator {
137 | final String char;
138 |
139 | const ThousandsPosSeparator._(this.char);
140 |
141 | /// Parse [char] to thousands pos separator
142 | factory ThousandsPosSeparator.parse(String char) {
143 | switch (char) {
144 | case ',':
145 | return comma;
146 | case '.':
147 | return dot;
148 | case ' ':
149 | return space;
150 | case '\'':
151 | return quote;
152 | }
153 |
154 | throw FormatException(
155 | "Invalid char. Valid characters: $values",
156 | char,
157 | );
158 | }
159 |
160 | /// [dot] means this format 1.000.000,00
161 | static const ThousandsPosSeparator dot = ThousandsPosSeparator._('.');
162 |
163 | /// [comma] means this format 1,000,000.00
164 | static const ThousandsPosSeparator comma = ThousandsPosSeparator._(',');
165 |
166 | /// [space] means this format 1 000 000,00
167 | static const ThousandsPosSeparator space = ThousandsPosSeparator._(' ');
168 |
169 | /// [space] means this format 1'000'000,00
170 | static const ThousandsPosSeparator quote = ThousandsPosSeparator._('\'');
171 |
172 | /// All thousands pos separators
173 | static List get values => const [comma, dot];
174 |
175 | @override
176 | String toString() => '$runtimeType.$char';
177 | }
178 |
--------------------------------------------------------------------------------
/lib/utils/bitcoin_validator/bitcoin_validator.dart:
--------------------------------------------------------------------------------
1 | import 'package:base58check/base58check.dart';
2 | import 'package:bech32/bech32.dart';
3 |
4 | import 'bitcoin_wallet_details.dart';
5 |
6 | const Map _networkByVersion = {
7 | 0: BitcoinAddressNetwork.Mainnet,
8 | 5: BitcoinAddressNetwork.Mainnet,
9 | 111: BitcoinAddressNetwork.Testnet,
10 | 196: BitcoinAddressNetwork.Testnet,
11 | };
12 |
13 | const Map _typeByVersion = {
14 | 0: BitcoinAddressType.P2KSH,
15 | 111: BitcoinAddressType.P2KSH,
16 | 5: BitcoinAddressType.P2SH,
17 | 196: BitcoinAddressType.P2SH,
18 | };
19 |
20 | /// A simplified wallet type check which only
21 | /// returns a wallet type like SegWit, Regular, or None
22 | /// if a wallet address is invalid
23 | BitcoinWalletType getBitcoinWalletType(String? value) {
24 | return getBitcoinWalletDetails(value).walletType;
25 | }
26 |
27 | bool isBitcoinWalletValid(String? value) {
28 | return getBitcoinWalletDetails(value).isValid;
29 | }
30 |
31 | /// Detailed wallet check. The returned object contains all
32 | /// the necessary info like address type, network, wallet type
33 | /// and address. Before using the returned object, use isValid
34 | /// getter to check if the result is valid
35 | BitcoinWalletDetails getBitcoinWalletDetails(String? value) {
36 | if (value == null || value.length < 34) {
37 | return BitcoinWalletDetails.invalid();
38 | }
39 | final isSegwitTest = value.startsWith('tb');
40 | final isSegwit = value.startsWith('bc');
41 | if (isSegwit || isSegwitTest) {
42 | return _getSegWitDetails(
43 | value,
44 | isSegwitTest,
45 | );
46 | }
47 |
48 | final checkCodec = Base58CheckCodec.bitcoin();
49 | Base58CheckPayload decoded;
50 | try {
51 | decoded = checkCodec.decode(value);
52 | } catch (e) {
53 | return BitcoinWalletDetails.invalid();
54 | }
55 | if (decoded.payload.length != 20) {
56 | return BitcoinWalletDetails.invalid();
57 | }
58 | final version = decoded.version;
59 | BitcoinAddressType? type = _typeByVersion[version];
60 | BitcoinAddressNetwork? network = _networkByVersion[version];
61 | if (type == null) {
62 | return BitcoinWalletDetails.invalid();
63 | }
64 | return BitcoinWalletDetails(
65 | address: value,
66 | addressNetwork: network!,
67 | addressType: type,
68 | walletType: BitcoinWalletType.Regular,
69 | );
70 | }
71 |
72 | BitcoinWalletDetails _getSegWitDetails(
73 | String value,
74 | bool isSegwitTest,
75 | ) {
76 | int programLength = 0;
77 | try {
78 | Segwit decodedSegwit = segwit.decode(value);
79 | programLength = decodedSegwit.program.length;
80 | } catch (e) {}
81 |
82 | BitcoinAddressType type = BitcoinAddressType.None;
83 | switch (programLength) {
84 | case 20:
85 | {
86 | type = BitcoinAddressType.P2KSH;
87 | }
88 | break;
89 | case 32:
90 | {
91 | type = BitcoinAddressType.P2SH;
92 | }
93 | }
94 |
95 | BitcoinAddressNetwork network = isSegwitTest
96 | ? BitcoinAddressNetwork.Testnet
97 | : BitcoinAddressNetwork.Mainnet;
98 |
99 | return BitcoinWalletDetails(
100 | address: value,
101 | addressNetwork: network,
102 | addressType: type,
103 | walletType: BitcoinWalletType.SegWit,
104 | );
105 | }
106 |
--------------------------------------------------------------------------------
/lib/utils/bitcoin_validator/bitcoin_wallet_details.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_multi_formatter/flutter_multi_formatter.dart';
2 |
3 | enum BitcoinAddressType {
4 | P2KSH,
5 | P2SH,
6 | None,
7 | }
8 |
9 | enum BitcoinAddressNetwork {
10 | Mainnet,
11 | Testnet,
12 | None,
13 | }
14 |
15 | enum BitcoinWalletType {
16 | SegWit,
17 | Regular,
18 | None,
19 | }
20 |
21 | class BitcoinWalletDetails {
22 | final String? address;
23 | final BitcoinAddressType addressType;
24 | final BitcoinAddressNetwork addressNetwork;
25 | final BitcoinWalletType walletType;
26 |
27 | @override
28 | operator ==(covariant BitcoinWalletDetails other) {
29 | return other.address == address &&
30 | other.walletType == walletType &&
31 | other.addressNetwork == addressNetwork &&
32 | other.addressNetwork == addressNetwork;
33 | }
34 |
35 | @override
36 | String toString() {
37 | if (isValid) {
38 | var stringBuffer = StringBuffer();
39 | stringBuffer.write(this.runtimeType);
40 | stringBuffer.write('\n');
41 | stringBuffer.write('Address: ');
42 | stringBuffer.write(address);
43 | stringBuffer.write('\n');
44 | stringBuffer.write('Network: ');
45 | stringBuffer.write(enumToString(addressNetwork));
46 | stringBuffer.write('\n');
47 | stringBuffer.write('Address type: ');
48 | stringBuffer.write(enumToString(addressType));
49 | stringBuffer.write('\n');
50 | stringBuffer.write('Wallet type: ');
51 | stringBuffer.write(enumToString(walletType));
52 | stringBuffer.write('\n');
53 | return stringBuffer.toString();
54 | }
55 | return 'Invalid Bitcoin wallet';
56 | }
57 |
58 | @override
59 | int get hashCode {
60 | return '$address$addressNetwork$addressType$walletType'.hashCode;
61 | }
62 |
63 | bool get isValid {
64 | return address != null && addressNetwork != BitcoinWalletType.None;
65 | }
66 |
67 | BitcoinWalletDetails({
68 | required this.address,
69 | required this.addressType,
70 | required this.addressNetwork,
71 | required this.walletType,
72 | });
73 |
74 | factory BitcoinWalletDetails.invalid() {
75 | return BitcoinWalletDetails(
76 | address: null,
77 | addressNetwork: BitcoinAddressNetwork.None,
78 | addressType: BitcoinAddressType.None,
79 | walletType: BitcoinWalletType.None,
80 | );
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/lib/utils/enum_utils.dart:
--------------------------------------------------------------------------------
1 | import 'package:collection/collection.dart';
2 |
3 | String? enumToString(dynamic enumValue) {
4 | if (enumValue == null) return null;
5 | return enumValue.toString().split('.')[1];
6 | }
7 |
8 | T? enumFromString(List enumValues, String? value) {
9 | if (value == null) return null;
10 |
11 | return enumValues.singleWhereOrNull(
12 | (enumItem) => enumToString(enumItem) == value,
13 | );
14 | }
15 |
--------------------------------------------------------------------------------
/lib/utils/luhn_algo.dart:
--------------------------------------------------------------------------------
1 | /// Implementation of th Luhn algorithm
2 | /// https://en.wikipedia.org/wiki/Luhn_algorithm
3 | bool checkNumberByLuhn({
4 | required String number,
5 | }) {
6 | final cardNumbers = number.split('');
7 | int numDigits = cardNumbers.length;
8 |
9 | int sum = 0;
10 | bool isSecond = false;
11 | for (int i = numDigits - 1; i >= 0; i--) {
12 | int d = int.parse(cardNumbers[i]);
13 |
14 | if (isSecond == true) {
15 | d = d * 2;
16 | }
17 |
18 | sum += d ~/ 10;
19 | sum += d % 10;
20 |
21 | isSecond = !isSecond;
22 | }
23 | return (sum % 10 == 0);
24 | }
25 |
--------------------------------------------------------------------------------
/lib/utils/unfocuser.dart:
--------------------------------------------------------------------------------
1 | /*
2 | (c) Copyright 2020 Serov Konstantin.
3 |
4 | Licensed under the MIT license:
5 |
6 | http://www.opensource.org/licenses/mit-license.php
7 |
8 | Permission is hereby granted, free of charge, to any person obtaining a copy
9 | of this software and associated documentation files (the "Software"), to deal
10 | in the Software without restriction, including without limitation the rights
11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | copies of the Software, and to permit persons to whom the Software is
13 | furnished to do so, subject to the following conditions:
14 |
15 | The above copyright notice and this permission notice shall be included in
16 | all copies or substantial portions of the Software.
17 |
18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | THE SOFTWARE.
25 | */
26 |
27 | import 'package:flutter/material.dart';
28 |
29 | class Unfocuser extends StatelessWidget {
30 | const Unfocuser({
31 | Key? key,
32 | required this.child,
33 | this.isEnabled = true,
34 | }) : super(
35 | key: key,
36 | );
37 |
38 | final Widget child;
39 | final bool isEnabled;
40 |
41 | @override
42 | Widget build(BuildContext context) {
43 | if (!isEnabled) {
44 | return child;
45 | }
46 | return GestureDetector(
47 | onTap: () {
48 | final focusScopeNode = FocusScope.of(context);
49 | if (focusScopeNode.hasPrimaryFocus == false &&
50 | focusScopeNode.focusedChild != null) {
51 | FocusManager.instance.primaryFocus?.unfocus();
52 | }
53 | },
54 | child: child,
55 | );
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/lib/widgets/country_flag.dart:
--------------------------------------------------------------------------------
1 | import 'dart:collection';
2 |
3 | import 'package:flutter/material.dart';
4 |
5 | class CountryFlag extends StatefulWidget {
6 | static HashSet _missingFlagCountryIds = HashSet();
7 |
8 | static bool hasFlagIcon(String countryId) {
9 | countryId = countryId.toLowerCase();
10 | return !_missingFlagCountryIds.contains(countryId);
11 | }
12 |
13 | final String countryId;
14 | final double width;
15 | final double height;
16 | final double borderRadius;
17 |
18 | const CountryFlag({
19 | Key? key,
20 | this.width = 40.0,
21 | this.height = 25.0,
22 | this.borderRadius = 2.0,
23 | required this.countryId,
24 | }) : super(key: key);
25 |
26 | @override
27 | _CountryFlagState createState() => _CountryFlagState();
28 | }
29 |
30 | class _CountryFlagState extends State {
31 | String get _countryId {
32 | return widget.countryId.toLowerCase();
33 | }
34 |
35 | String get _flagPath {
36 | return 'flags/png/$_countryId.png';
37 | }
38 |
39 | @override
40 | Widget build(BuildContext context) {
41 | return Container(
42 | height: widget.height,
43 | width: widget.width,
44 | decoration: BoxDecoration(
45 | borderRadius: BorderRadius.all(
46 | Radius.circular(
47 | widget.borderRadius,
48 | ),
49 | ),
50 | image: DecorationImage(
51 | image: AssetImage(
52 | _flagPath,
53 | package: 'flutter_multi_formatter',
54 | ),
55 | onError: (e, s) {
56 | setState(() {
57 | CountryFlag._missingFlagCountryIds.add(_countryId);
58 | });
59 | },
60 | fit: BoxFit.cover,
61 | ),
62 | ),
63 | );
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://dart.dev/tools/pub/glossary#lockfile
3 | packages:
4 | async:
5 | dependency: transitive
6 | description:
7 | name: async
8 | sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
9 | url: "https://pub.dev"
10 | source: hosted
11 | version: "2.12.0"
12 | base58check:
13 | dependency: "direct main"
14 | description:
15 | name: base58check
16 | sha256: "6c300dfc33e598d2fe26319e13f6243fea81eaf8204cb4c6b69ef20a625319a5"
17 | url: "https://pub.dev"
18 | source: hosted
19 | version: "2.0.0"
20 | bech32:
21 | dependency: "direct main"
22 | description:
23 | name: bech32
24 | sha256: "156cbace936f7720c79a79d16a03efad343b1ef17106716e04b8b8e39f99f7f7"
25 | url: "https://pub.dev"
26 | source: hosted
27 | version: "0.2.2"
28 | boolean_selector:
29 | dependency: transitive
30 | description:
31 | name: boolean_selector
32 | sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
33 | url: "https://pub.dev"
34 | source: hosted
35 | version: "2.1.2"
36 | characters:
37 | dependency: transitive
38 | description:
39 | name: characters
40 | sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
41 | url: "https://pub.dev"
42 | source: hosted
43 | version: "1.4.0"
44 | clock:
45 | dependency: transitive
46 | description:
47 | name: clock
48 | sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
49 | url: "https://pub.dev"
50 | source: hosted
51 | version: "1.1.2"
52 | collection:
53 | dependency: "direct main"
54 | description:
55 | name: collection
56 | sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
57 | url: "https://pub.dev"
58 | source: hosted
59 | version: "1.19.1"
60 | convert:
61 | dependency: transitive
62 | description:
63 | name: convert
64 | sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
65 | url: "https://pub.dev"
66 | source: hosted
67 | version: "3.1.1"
68 | crypto:
69 | dependency: transitive
70 | description:
71 | name: crypto
72 | sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67
73 | url: "https://pub.dev"
74 | source: hosted
75 | version: "3.0.2"
76 | fake_async:
77 | dependency: transitive
78 | description:
79 | name: fake_async
80 | sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
81 | url: "https://pub.dev"
82 | source: hosted
83 | version: "1.3.2"
84 | flutter:
85 | dependency: "direct main"
86 | description: flutter
87 | source: sdk
88 | version: "0.0.0"
89 | flutter_test:
90 | dependency: "direct dev"
91 | description: flutter
92 | source: sdk
93 | version: "0.0.0"
94 | leak_tracker:
95 | dependency: transitive
96 | description:
97 | name: leak_tracker
98 | sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
99 | url: "https://pub.dev"
100 | source: hosted
101 | version: "10.0.8"
102 | leak_tracker_flutter_testing:
103 | dependency: transitive
104 | description:
105 | name: leak_tracker_flutter_testing
106 | sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
107 | url: "https://pub.dev"
108 | source: hosted
109 | version: "3.0.9"
110 | leak_tracker_testing:
111 | dependency: transitive
112 | description:
113 | name: leak_tracker_testing
114 | sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3"
115 | url: "https://pub.dev"
116 | source: hosted
117 | version: "3.0.1"
118 | matcher:
119 | dependency: transitive
120 | description:
121 | name: matcher
122 | sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
123 | url: "https://pub.dev"
124 | source: hosted
125 | version: "0.12.17"
126 | material_color_utilities:
127 | dependency: transitive
128 | description:
129 | name: material_color_utilities
130 | sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec
131 | url: "https://pub.dev"
132 | source: hosted
133 | version: "0.11.1"
134 | meta:
135 | dependency: transitive
136 | description:
137 | name: meta
138 | sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
139 | url: "https://pub.dev"
140 | source: hosted
141 | version: "1.16.0"
142 | path:
143 | dependency: transitive
144 | description:
145 | name: path
146 | sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
147 | url: "https://pub.dev"
148 | source: hosted
149 | version: "1.9.1"
150 | sky_engine:
151 | dependency: transitive
152 | description: flutter
153 | source: sdk
154 | version: "0.0.0"
155 | source_span:
156 | dependency: transitive
157 | description:
158 | name: source_span
159 | sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
160 | url: "https://pub.dev"
161 | source: hosted
162 | version: "1.10.1"
163 | stack_trace:
164 | dependency: transitive
165 | description:
166 | name: stack_trace
167 | sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
168 | url: "https://pub.dev"
169 | source: hosted
170 | version: "1.12.1"
171 | stream_channel:
172 | dependency: transitive
173 | description:
174 | name: stream_channel
175 | sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
176 | url: "https://pub.dev"
177 | source: hosted
178 | version: "2.1.4"
179 | string_scanner:
180 | dependency: transitive
181 | description:
182 | name: string_scanner
183 | sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
184 | url: "https://pub.dev"
185 | source: hosted
186 | version: "1.4.1"
187 | term_glyph:
188 | dependency: transitive
189 | description:
190 | name: term_glyph
191 | sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
192 | url: "https://pub.dev"
193 | source: hosted
194 | version: "1.2.2"
195 | test_api:
196 | dependency: transitive
197 | description:
198 | name: test_api
199 | sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
200 | url: "https://pub.dev"
201 | source: hosted
202 | version: "0.7.4"
203 | typed_data:
204 | dependency: transitive
205 | description:
206 | name: typed_data
207 | sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5"
208 | url: "https://pub.dev"
209 | source: hosted
210 | version: "1.3.1"
211 | vector_math:
212 | dependency: transitive
213 | description:
214 | name: vector_math
215 | sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
216 | url: "https://pub.dev"
217 | source: hosted
218 | version: "2.1.4"
219 | vm_service:
220 | dependency: transitive
221 | description:
222 | name: vm_service
223 | sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
224 | url: "https://pub.dev"
225 | source: hosted
226 | version: "14.3.1"
227 | sdks:
228 | dart: ">=3.7.0-0 <4.0.0"
229 | flutter: ">=3.18.0-18.0.pre.54"
230 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: flutter_multi_formatter
2 | description: A package of formatters for international phone numbers, credit / debit cards and a masked formatter
3 | version: 2.13.7
4 | homepage: https://github.com/caseyryan/flutter_multi_formatter
5 |
6 | environment:
7 | sdk: ">=2.19.0 <4.0.0"
8 | flutter: ">=2.0.0"
9 |
10 | dependencies:
11 | flutter:
12 | sdk: flutter
13 | collection: ^1.15.0
14 | base58check: ^2.0.0
15 | bech32: ^0.2.0
16 |
17 | dev_dependencies:
18 | flutter_test:
19 | sdk: flutter
20 |
21 | # flutter pub publish
22 | # To format every file in directory use:
23 | # For information on the generic Dart part of this file, see the
24 | # following page: https://dart.dev/tools/pub/pubspec
25 |
26 | # The following section is specific to Flutter.
27 | flutter:
28 |
29 | # To add assets to your package, add an assets section, like this:
30 | assets:
31 | - flags/png/
32 | #
33 | # For details regarding assets in packages, see
34 | # https://flutter.dev/assets-and-images/#from-packages
35 | #
36 | # An image asset can refer to one or more resolution-specific "variants", see
37 | # https://flutter.dev/assets-and-images/#resolution-aware.
38 |
39 | # To add custom fonts to your package, add a fonts section here,
40 | # in this "flutter" section. Each entry in this list should have a
41 | # "family" key with the font family name, and a "fonts" key with a
42 | # list giving the asset and other descriptors for the font. For
43 | # example:
44 | # fonts:
45 | # - family: Schyler
46 | # fonts:
47 | # - asset: fonts/Schyler-Regular.ttf
48 | # - asset: fonts/Schyler-Italic.ttf
49 | # style: italic
50 | # - family: Trajan Pro
51 | # fonts:
52 | # - asset: fonts/TrajanPro.ttf
53 | # - asset: fonts/TrajanPro_Bold.ttf
54 | # weight: 700
55 | #
56 | # For details regarding fonts in packages, see
57 | # https://flutter.dev/custom-fonts/#from-packages
58 |
--------------------------------------------------------------------------------
/test/flutter_money_input_formatter_test.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/cupertino.dart';
2 | import 'package:flutter_test/flutter_test.dart';
3 |
4 | import '../lib/flutter_multi_formatter.dart';
5 |
6 | void main() {
7 | test('should correctly remove a comma from thousands', () {
8 | final currentNumber = "1,000.0";
9 | final inputNumber = "1,00.0";
10 | final formattedNumber = CurrencyInputFormatter()
11 | .formatEditUpdate(
12 | TextEditingValue(
13 | text: currentNumber,
14 | selection: TextSelection(baseOffset: 4, extentOffset: 5),
15 | composing: TextRange(start: -1, end: -1)),
16 | TextEditingValue(
17 | text: inputNumber,
18 | selection: TextSelection(baseOffset: 4, extentOffset: 4),
19 | composing: TextRange(start: -1, end: -1)))
20 | .text;
21 | expect(formattedNumber, "100.00");
22 | });
23 | }
24 |
--------------------------------------------------------------------------------
/test/flutter_multi_formatter_test.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_test/flutter_test.dart';
2 |
3 | import '../lib/flutter_multi_formatter.dart';
4 |
5 | void main() {
6 | test(
7 | 'should use the philippines land line mask (shorter one) when partially entering a number',
8 | () {
9 | final inputNumber = '+6355666';
10 | final formattedNumber = PhoneInputFormatter()
11 | .formatEditUpdate(
12 | TextEditingValue(text: ''), TextEditingValue(text: inputNumber))
13 | .text;
14 | expect(formattedNumber, '+63 55 666');
15 | });
16 |
17 | test('should format philippines land line with full number length', () {
18 | final inputNumber = '+63556667777';
19 | final formattedNumber = PhoneInputFormatter()
20 | .formatEditUpdate(
21 | TextEditingValue(text: ''), TextEditingValue(text: inputNumber))
22 | .text;
23 | expect(formattedNumber, '+63 55 666 77 77');
24 | });
25 |
26 | test('should format philippines mobile number with full number length', () {
27 | final inputNumber = '+635556667777';
28 | final formattedNumber = PhoneInputFormatter()
29 | .formatEditUpdate(
30 | TextEditingValue(text: ''), TextEditingValue(text: inputNumber))
31 | .text;
32 | expect(formattedNumber, '+63 555 666 77 77');
33 | });
34 |
35 | test('should format US number with full number length', () {
36 | final inputNumber = '+14444444444';
37 | final formattedNumber = PhoneInputFormatter()
38 | .formatEditUpdate(
39 | TextEditingValue(text: ''), TextEditingValue(text: inputNumber))
40 | .text;
41 | expect(formattedNumber, '+1 (444) 444 4444');
42 | });
43 |
44 | test('should partially format a US number', () {
45 | final inputNumber = '+14444';
46 | final formattedNumber = PhoneInputFormatter()
47 | .formatEditUpdate(
48 | TextEditingValue(text: ''), TextEditingValue(text: inputNumber))
49 | .text;
50 | expect(formattedNumber, '+1 (444) 4');
51 | });
52 |
53 | test('unknown number without default mask', () {
54 | final inputNumber = '+999444';
55 | final withoutDefault = formatAsPhoneNumber(
56 | inputNumber,
57 | allowEndlessPhone: true,
58 | );
59 | expect(withoutDefault, inputNumber);
60 | });
61 |
62 | test('unknown number with default mask', () {
63 | final inputNumber = '+999444';
64 | final withDefault = formatAsPhoneNumber(
65 | inputNumber,
66 | allowEndlessPhone: true,
67 | defaultMask: '+00 0000 000 000',
68 | );
69 | expect(withDefault, '+99 9444');
70 | });
71 |
72 | test('known number and default mask', () {
73 | final inputNumber = '+112345';
74 | final formatted = '+1 (123) 45';
75 | final withDefault = formatAsPhoneNumber(
76 | inputNumber,
77 | allowEndlessPhone: true,
78 | defaultMask: '+00 0000 000 000',
79 | );
80 | expect(withDefault, formatted);
81 |
82 | final withoutDefault = formatAsPhoneNumber(
83 | inputNumber,
84 | allowEndlessPhone: true,
85 | );
86 | expect(withoutDefault, formatted);
87 | });
88 |
89 | group('congo', () {
90 | group('242', () {
91 | test('should format partial congo mask +000 00', () {
92 | final inputNumber = '+24255';
93 |
94 | final formattedNumber = PhoneInputFormatter()
95 | .formatEditUpdate(
96 | TextEditingValue(text: ''),
97 | TextEditingValue(text: inputNumber),
98 | )
99 | .text;
100 |
101 | expect(formattedNumber, '+242 55');
102 | });
103 |
104 | test('should format partial congo mask +000 00 00', () {
105 | final inputNumber = '+2425566';
106 |
107 | final formattedNumber = PhoneInputFormatter()
108 | .formatEditUpdate(
109 | TextEditingValue(text: ''),
110 | TextEditingValue(text: inputNumber),
111 | )
112 | .text;
113 |
114 | expect(formattedNumber, '+242 55 66');
115 | });
116 |
117 | test('should format full congo mask +000 00 00 00000', () {
118 | final inputNumber = '+242556677777';
119 |
120 | final formattedNumber = PhoneInputFormatter()
121 | .formatEditUpdate(
122 | TextEditingValue(text: ''),
123 | TextEditingValue(text: inputNumber),
124 | )
125 | .text;
126 |
127 | expect(formattedNumber, '+242 55 66 77777');
128 | });
129 | });
130 |
131 | group('243', () {
132 | test('should format partial congo mask +000 00', () {
133 | final inputNumber = '+24355';
134 |
135 | final formattedNumber = PhoneInputFormatter()
136 | .formatEditUpdate(
137 | TextEditingValue(text: ''),
138 | TextEditingValue(text: inputNumber),
139 | )
140 | .text;
141 |
142 | expect(formattedNumber, '+243 55');
143 | });
144 |
145 | test('should format partial congo mask +000 00 00', () {
146 | final inputNumber = '+2435566';
147 |
148 | final formattedNumber = PhoneInputFormatter()
149 | .formatEditUpdate(
150 | TextEditingValue(text: ''),
151 | TextEditingValue(text: inputNumber),
152 | )
153 | .text;
154 |
155 | expect(formattedNumber, '+243 55 66');
156 | });
157 |
158 | test('should format full congo mask +000 00 00 00000', () {
159 | final inputNumber = '+243556677777';
160 |
161 | final formattedNumber = PhoneInputFormatter()
162 | .formatEditUpdate(
163 | TextEditingValue(text: ''),
164 | TextEditingValue(text: inputNumber),
165 | )
166 | .text;
167 |
168 | expect(formattedNumber, '+243 55 66 77777');
169 | });
170 | });
171 | });
172 | }
173 |
--------------------------------------------------------------------------------
/test/flutter_pos_input_formatter_test.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/services.dart';
2 | import 'package:flutter_multi_formatter/formatters/pos_input_formatter.dart';
3 | import 'package:flutter_test/flutter_test.dart';
4 |
5 | void main() {
6 | const decimalSeparator = '.';
7 | const formatter = PosInputFormatter(
8 | decimalSeparator: DecimalPosSeparator.dot,
9 | thousandsSeparator: ThousandsPosSeparator.space,
10 | mantissaLength: 2,
11 | );
12 |
13 | group('Test PosInputFormatter text input formatter', () {
14 | group(
15 | 'Tests for adding zeroes at the beginning of the number and adding decimal separator',
16 | () {
17 | test('Add "0.0" at the beginning of the string', () {
18 | const oldValue = TextEditingValue();
19 | const newValue = TextEditingValue(
20 | text: '1',
21 | selection: TextSelection.collapsed(offset: 1),
22 | );
23 | const expectedValue = TextEditingValue(
24 | text: '0${decimalSeparator}01',
25 | selection: TextSelection.collapsed(offset: 4),
26 | );
27 |
28 | expect(formatter.formatEditUpdate(oldValue, newValue), expectedValue);
29 | });
30 | test('Add "0." at the beginning of the string', () {
31 | const oldValue = TextEditingValue(
32 | text: '1',
33 | selection: TextSelection.collapsed(offset: 1),
34 | );
35 | const newValue = TextEditingValue(
36 | text: '12',
37 | selection: TextSelection.collapsed(offset: 2),
38 | );
39 | const expectedValue = TextEditingValue(
40 | text: '0${decimalSeparator}12',
41 | selection: TextSelection.collapsed(offset: 4),
42 | );
43 |
44 | expect(formatter.formatEditUpdate(oldValue, newValue), expectedValue);
45 | });
46 | test('Add "." to the string', () {
47 | const oldValue = TextEditingValue(
48 | text: '12',
49 | selection: TextSelection.collapsed(offset: 2),
50 | );
51 | const newValue = TextEditingValue(
52 | text: '123',
53 | selection: TextSelection.collapsed(offset: 3),
54 | );
55 | const expectedValue = TextEditingValue(
56 | text: '1${decimalSeparator}23',
57 | selection: TextSelection.collapsed(offset: 4),
58 | );
59 |
60 | expect(formatter.formatEditUpdate(oldValue, newValue), expectedValue);
61 | });
62 | test('Add "." between 4 digits', () {
63 | const oldValue = TextEditingValue(
64 | text: '1.23',
65 | selection: TextSelection.collapsed(offset: 4),
66 | );
67 | const newValue = TextEditingValue(
68 | text: '1.234',
69 | selection: TextSelection.collapsed(offset: 5),
70 | );
71 | const expectedValue = TextEditingValue(
72 | text: '12${decimalSeparator}34',
73 | selection: TextSelection.collapsed(offset: 5),
74 | );
75 |
76 | expect(formatter.formatEditUpdate(oldValue, newValue), expectedValue);
77 | });
78 | });
79 |
80 | group('Tests for adding the thousands separator', () {
81 | test('Not add space', () {
82 | const oldValue = TextEditingValue(
83 | text: '12.34',
84 | selection: TextSelection.collapsed(offset: 5),
85 | );
86 | const newValue = TextEditingValue(
87 | text: '12.345',
88 | selection: TextSelection.collapsed(offset: 6),
89 | );
90 | const expectedValue = TextEditingValue(
91 | text: '123${decimalSeparator}45',
92 | selection: TextSelection.collapsed(offset: 6),
93 | );
94 |
95 | expect(formatter.formatEditUpdate(oldValue, newValue), expectedValue);
96 | });
97 | test('Add space to the string', () {
98 | const oldValue = TextEditingValue(
99 | text: '123.45',
100 | selection: TextSelection.collapsed(offset: 5),
101 | );
102 | const newValue = TextEditingValue(
103 | text: '123.456',
104 | selection: TextSelection.collapsed(offset: 7),
105 | );
106 | const expectedValue = TextEditingValue(
107 | text: '1 234${decimalSeparator}56',
108 | selection: TextSelection.collapsed(offset: 8),
109 | );
110 |
111 | expect(formatter.formatEditUpdate(oldValue, newValue), expectedValue);
112 | });
113 | test('Add only one space to the string', () {
114 | const oldValue = TextEditingValue(
115 | text: '12 345.67',
116 | selection: TextSelection.collapsed(offset: 9),
117 | );
118 | const newValue = TextEditingValue(
119 | text: '123 45.678',
120 | selection: TextSelection.collapsed(offset: 10),
121 | );
122 | const expectedValue = TextEditingValue(
123 | text: '123 456${decimalSeparator}78',
124 | selection: TextSelection.collapsed(offset: 10),
125 | );
126 |
127 | expect(formatter.formatEditUpdate(oldValue, newValue), expectedValue);
128 | });
129 | test('Add two space to the string', () {
130 | const oldValue = TextEditingValue(
131 | text: '123 456.78',
132 | selection: TextSelection.collapsed(offset: 10),
133 | );
134 | const newValue = TextEditingValue(
135 | text: '123 456.789',
136 | selection: TextSelection.collapsed(offset: 11),
137 | );
138 | const expectedValue = TextEditingValue(
139 | text: '1 234 567${decimalSeparator}89',
140 | selection: TextSelection.collapsed(offset: 12),
141 | );
142 |
143 | expect(formatter.formatEditUpdate(oldValue, newValue), expectedValue);
144 | });
145 | });
146 |
147 | test('Remove incorrect characters', () {
148 | const oldValue = TextEditingValue(
149 | text: '',
150 | selection: TextSelection.collapsed(offset: 0),
151 | );
152 | const newValue = TextEditingValue(
153 | text: '123d45a.6',
154 | selection: TextSelection.collapsed(offset: 9),
155 | );
156 | const expectedValue = TextEditingValue(
157 | text: '1 234${decimalSeparator}56',
158 | selection: TextSelection.collapsed(offset: 8),
159 | );
160 |
161 | expect(formatter.formatEditUpdate(oldValue, newValue), expectedValue);
162 | });
163 | });
164 | }
165 |
--------------------------------------------------------------------------------
/test/pinyin_syllable_converter.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter_multi_formatter/utils/pinyin_utils.dart';
2 | import 'package:flutter_test/flutter_test.dart';
3 |
4 | void main() {
5 | test('Tests pinyin format', () {
6 | var result = PinyinUtils.splitToSyllables(
7 | 'wǒhěngāoxìngrènshinǐ',
8 | );
9 | final numValid = result.where((e) => e.isValid).length;
10 | expect(
11 | numValid,
12 | 7,
13 | reason: 'Expcted number of valid syllables is 7',
14 | );
15 | });
16 | }
17 |
--------------------------------------------------------------------------------
/публикация:
--------------------------------------------------------------------------------
1 | fvm flutter pub publish --dry-run проверка
2 | fvm flutter pub publish
3 |
4 | fvm flutter dartfmt . чтобы отформатировать все файлы как надо
5 |
--------------------------------------------------------------------------------