├── .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 | --------------------------------------------------------------------------------