ESP-Touch Dart API for Flutter. Platform-specific implementation for Android (Java) and iOS (Objective-C).

Overview

esptouch_flutter

Flutter plugin for ESP-Touch to configure network for ESP-8266 and ESP-32 devices. Runs on iOS and Android.

esptouch_flutter is Flutter plugin package which contains an API for ESP-Touch written in Dart combined with platform-specific implementation for Android using Java and iOS using Objective-C.

This package provides a high customizability to the ESP Touch tasks and an idiomatic Dart interface for launching tasks. Custom task parameters lets the users of this plugin change how long the task runs, you could set it to hours, if this is what your workflow requires.

smaho-engineering/esptouch_flutter

weekday_selector

GitHub Stars Count

Important links

Usage

Example app

GIF Flutter plugin esptouch_flutter - Example app in action

For a complete example app, see the example folder in the repository.

The example app lets you configure WiFi SSID, BSSID, password, the duration of the task, expected task count and many more.

For a simplest possible app, see the smaho-engineering/esptouch_flutter_kotlin_example repository.

Code snippets

import 'package:esptouch_flutter/esptouch_flutter.dart';

// Somewhere in your widget...
final ESPTouchTask task = ESPTouchTask(
  ssid: 'My WiFi network',
  bssid: 'ab:cd:ef:12:23:34',
  password: 'I love SMAHO',
);
final Stream<ESPTouchResult> stream = task.execute();
final printResult = (ESPTouchResult result) {
 print('IP: ${result.ip} MAC: ${result.bssid}');
};
StreamSubscription<ESPTouchResult> streamSubscription = stream.listen(printResult);

// Don't forget to cancel your stream subscription.
// You might cancel after the UDP wait+send time has passed (default 1 min)
// or you could cancel when the user asked to cancel
// for example, either via X button, or popping a route off the stack.
streamSubscription.cancel();

If you would like to customize the task, provide an ESPTouchTaskParameter instance as taskParameter to ESPTouchTask. In the code example, I specify the types for clarity but you can omit the types as Dart can infer them.

final ESPTouchTask task = ESPTouchTask(
  ssid: 'My WiFi network',
  bssid: 'ab:cd:ef:12:23:34',
  password: 'I love Flutter and ESP-Touch, too',
  // Tweak the task using task parameters
  taskParameter: ESPTouchTaskParameter(waitUdpReceiving: Duration(hour: 12)),
);
// You can still stop the task at any point by calling .cancel on the stream subscription:
streamSubscription.cancel();

In a real world example, you'd get the WiFi credentials from the user and you could either display the configured device, save it locally in SQLite or send it to your backend.

Fundamentals

Use a real phone for development. The plugin will not work in emulators and simulators, so you need real phones for development. Run flutter devices to verify.

Prepare your embedded devices. To verify that the ESP-Touch app works, you need some hardware with ESP8266 and ESP32 to connect to your WiFi network.

connectivity

You may to provide an easy way for getting the current WiFi network's SSID and BSSID. Use the connectivity plugin for discovering the state of the network (WiFi & mobile/cellular) connectivity on Android and iOS.

ESP-Touch

Using ESP-Touch, you can configure network for ESP8266 and ESP32 devices.

Espressif’s ESP-Touch protocol implements the Smart Config technology to help users connect ESP8266EX- and ESP32-embedded devices to a Wi-Fi network through simple configuration on a smartphone.

Resources

You can read more about ESP-Touch here:

The original iOS and Android modules had to be heavily customized and tweaked in order to support custom task parameters.

Known issues

  • We needed full customizability for the touch task parameters, these made changing a significant chunk of the Android and iOS platform side code necessary. We added builders for the task parameters as this looked like a solution that required the least changes to the platform code.
  • The only way I could implement this plugin is by pasting the platform-specific code into this project. One reason for this was that it wasn't published anywhere as easily installable packages, and the second reason is that I had to tweak the platform code to support configuration of the ESPTouchTaskParameters. This means that new changes to the original git repositories do not automatically show up in this project, so we need to manually update the Android and iOS code.
  • The underlying Android and iOS apps support different task parameters. There were multiple changes especially around IPv4 vs IPv6 handling. The plugin does not handle all of these differences.
  • Keeping track of finished tasks is necessary on Flutter's side.
  • AES support (last I checked the support differred on Android and iOS, so I haven't added them)

Breaking change in iOS 14.6

Starting with iOS 14.6 the com.apple.developer.networking.multicast entitlement is required, to allow the broadcasting of IP packages on iOS, which is used by esptouch.

In order ot enable it, you need to request the entitlemant as an account holder here. Once you are enrolled, you can configure it here Screen Shot 2021-06-21 at 17 24 50

Contribute

This is an open-source project built by the SMAHO Engineering team from Munich to wrap Espressif's ESP-Touch mobile app kits.

Flutter

If you are coming from IoT background, you might not know what Flutter is.

Flutter is Google's UI toolkit for creating beautiful, native experiences for iOS and Android from a single codebase. For help getting started with Flutter, view the online documentation. This repository contains a Flutter plugin package for ESP-Touch. A plugin package is a specialized package that includes platform-specific implementation code for Android and iOS. The Flutter portion of the app sends messages to its host (iOS or Android) over a platform channel. This plugin relies on platform channels (event channels) heavily.

Comments
  • Cannot pair new device on iOS 16

    Cannot pair new device on iOS 16

    I tried to connect with different devices running iOS < 16 and it worked very well. But it could not match my iPhone XS Max and iPhone XS that have updated to iOS 16.

    It would be great if you guys can release an update for iOS 16. Thank you a lot.

    opened by nguyen703 15
  • Can this package get converted to native dart

    Can this package get converted to native dart

    I was wondering if this package or part of it can get converted to native dart and thus work on all platforms, and can get executed from server side as well?.

    What part of this library require the flutter framework and what part of it only required native dart code.

    opened by guyluz11 10
  • java.lang.InterruptedException

    java.lang.InterruptedException

    Thanks so much for making this package. It's just what I need for my ESP32 project. I build a test app using the connectivity package to get the device's Wi-Fi details then your sample code to configure the ESP32 device. My code to configure the device is:

    print('setWifiConfig()');
    if (_wifiName != null && _wifiBSSID != null && _wifiPassword != null) {
      final ESPTouchTask task = ESPTouchTask(
        ssid: _wifiName,
        bssid: _wifiBSSID,
        password: _wifiPassword,
      );
      final Stream<ESPTouchResult> stream = task.execute();
      final printResult = (ESPTouchResult result) {
        print('IP: ${result.ip} MAC: ${result.bssid}');
        setState(() {
          _remoteNotifyIPAddress = result.ip;
          _remoteNotifyMacAddress = result.bssid;
        });
      };
      StreamSubscription<ESPTouchResult> streamSubscription =
      stream.listen(printResult);
      // Don't forget to cancel your stream subscription:
      streamSubscription.cancel();
    } else {
      print('Missing configuration value');
    }
    

    but when I run the app, I get the following:

    D/EsptouchPlugin( 6006): Event Listener is triggered
    D/EsptouchPlugin( 6006): Received stream configuration arguments: SSID: NETWORK_NAME, BBSID: 70:3a:cb:19:75:99, Password: PASSWORD, Packet: 1, Task parameter: {thresholdSucBroadcastCount=1, expectTaskResultCount=1, esptouchResultTotalLen=11, waitUdpReceivingMillisecond=15000, targetPort=7001, intervalDataCodeMillisecond=8, esptouchResultOneLen=1, esptouchResultMacLen=6, intervalGuideCodeMillisecond=8, timeoutDataCodeMillisecond=4000, waitUdpSendingMillisecond=45000, esptouchResultIpLen=4, totalRepeatTime=1, portListening=18266, timeoutGuideCodeMillisecond=2000}
    D/EsptouchPlugin( 6006): Converted taskUtil parameter from map {thresholdSucBroadcastCount=1, expectTaskResultCount=1, esptouchResultTotalLen=11, waitUdpReceivingMillisecond=15000, targetPort=7001, intervalDataCodeMillisecond=8, esptouchResultOneLen=1, esptouchResultMacLen=6, intervalGuideCodeMillisecond=8, timeoutDataCodeMillisecond=4000, waitUdpSendingMillisecond=45000, esptouchResultIpLen=4, totalRepeatTime=1, portListening=18266, timeoutGuideCodeMillisecond=2000} to EsptouchTaskParameter com.espressif.iot.esptouch.task.EsptouchTaskParameter@3b00906.
    D/EsptouchPlugin( 6006): Cancelling stream with configuration arguments{password=nothing is ever easy, bssid=70:3a:cb:19:75:62, taskParameter={thresholdSucBroadcastCount=1, expectTaskResultCount=1, esptouchResultTotalLen=11, waitUdpReceivingMillisecond=15000, targetPort=7001, intervalDataCodeMillisecond=8, esptouchResultOneLen=1, esptouchResultMacLen=6, intervalGuideCodeMillisecond=8, timeoutDataCodeMillisecond=4000, waitUdpSendingMillisecond=45000, esptouchResultIpLen=4, totalRepeatTime=1, portListening=18266, timeoutGuideCodeMillisecond=2000}, packet=1, ssid=Wargo}
    D/EsptouchPlugin( 6006): Task existed, cancelling manually
    D/EspTouchTaskUtil( 6006): cancel
    D/EspTouchAsyncTask( 6006): cancelEsptouch
    I/__EsptouchTask( 6006): Welcome Esptouch v0.3.7.0
    D/UDPSocketServer( 6006): mServerSocket is created, socket read timeout: 60000, port: 18266
    D/EspTouchAsyncTask( 6006): Expected task result count is : 1
    D/__EsptouchTask( 6006): execute()
    I/__EsptouchTask( 6006): localInetAddress: /192.168.86.30
    D/__EsptouchTask( 6006): send gc code 
    D/__EsptouchTask( 6006): __listenAsyn() start
    I/__EsptouchTask( 6006): expectOneByte: 34
    D/UDPSocketServer( 6006): receiveSpecLenBytes() entrance: len = 11
    W/System.err( 6006): java.lang.InterruptedException
    W/System.err( 6006): 	at java.lang.Thread.sleep(Native Method)
    W/System.err( 6006): 	at java.lang.Thread.sleep(Thread.java:440)
    W/System.err( 6006): 	at java.lang.Thread.sleep(Thread.java:356)
    W/System.err( 6006): 	at com.espressif.iot.esptouch.udp.UDPSocketClient.sendData(UDPSocketClient.java:116)
    W/System.err( 6006): 	at com.espressif.iot.esptouch.udp.UDPSocketClient.sendData(UDPSocketClient.java:71)
    W/System.err( 6006): 	at com.espressif.iot.esptouch.task.__EsptouchTask.__execute(__EsptouchTask.java:253)
    W/System.err( 6006): 	at com.espressif.iot.esptouch.task.__EsptouchTask.executeForResults(__EsptouchTask.java:325)
    W/System.err( 6006): 	at com.espressif.iot.esptouch.EsptouchTask.executeForResults(EsptouchTask.java:106)
    W/System.err( 6006): 	at com.smaho.eng.esptouch.EspTouchTaskUtil$EspTouchAsyncTask.doInBackground(EspTouchTaskUtil.java:75)
    W/System.err( 6006): 	at com.smaho.eng.esptouch.EspTouchTaskUtil$EspTouchAsyncTask.doInBackground(EspTouchTaskUtil.java:33)
    W/System.err( 6006): 	at android.os.AsyncTask$3.call(AsyncTask.java:378)
    W/System.err( 6006): 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    W/System.err( 6006): 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
    W/System.err( 6006): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    W/System.err( 6006): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    W/System.err( 6006): 	at java.lang.Thread.run(Thread.java:919)
    W/UDPSocketClient( 6006): sendData is Interrupted
    D/__EsptouchTask( 6006): send gc code 
    D/__EsptouchTask( 6006): send gc code 
    D/__EsptouchTask( 6006): send gc code 
    

    Have you seen this before? Do you know how I can fix this?

    opened by johnwargo 8
  • Error: Cannot run with sound null safety

    Error: Cannot run with sound null safety

    I cannot build my project with this library included. I'm getting this error:

    Error: Cannot run with sound null safety, because the following dependencies
    don't support null safety:
    
    - package:esptouch_flutter
    
    For solutions, see https://dart.dev/go/unsound-null-safety
    

    Can you please make this library to support null safety?

    opened by abobija 7
  • Not working on ios14

    Not working on ios14

    I have been using this with no problem until I'm updating to ios14 and esptouch stop working and get error

    client: sendto fail, but just ignore it : No route to host

    bug 
    opened by tamahos 6
  • need support V2 embedding.

    need support V2 embedding.

    The plugin esptouch_flutter uses a deprecated version of the Android embedding. To avoid unexpected runtime failures, or future build failures, try to see if this plugin supports the Android V2 embedding. Otherwise, consider removing it since a future release of Flutter will remove these deprecated APIs. If you are plugin author, take a look at the docs for migrating the plugin to the V2 embedding: https://flutter.dev/go/android-plugin-migration.

    prerelease 
    opened by Wingge 4
  • latest version not working

    latest version not working

    [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: MissingPluginException(No implementation found for method ssid on channel eng.smaho.com/esptouch_plugin/example) E/flutter (23722): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:7) E/flutter (23722): E/flutter (23722): #1 ssid (package:join_kit/wifi_info.dart:9:10) E/flutter (23722): E/flutter (23722): #2 _MyAppState.fetchWifiInfo (package:join_kit/main.dart:104:20) E/flutter (23722):

    opened by sudhakardharmaraju 4
  • Java.lang.RuntimeException: An error occurred while executing doInBackground() in Release mode

    Java.lang.RuntimeException: An error occurred while executing doInBackground() in Release mode

    Hello,

    I seem to be having issues when building the app in release mode as when I initiate the task I get the following exception:

    E/AndroidRuntime(28329): FATAL EXCEPTION: AsyncTask #1
    E/AndroidRuntime(28329): Process: com.wegotech.gategodeploy, PID: 28329
    E/AndroidRuntime(28329): java.lang.RuntimeException: An error occurred while executing doInBackground()
    E/AndroidRuntime(28329):        at android.os.AsyncTask$4.done(AsyncTask.java:399)
    E/AndroidRuntime(28329):        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
    E/AndroidRuntime(28329):        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
    E/AndroidRuntime(28329):        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
    E/AndroidRuntime(28329):        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
    E/AndroidRuntime(28329):        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    E/AndroidRuntime(28329):        at java.lang.Thread.run(Thread.java:919)
    E/AndroidRuntime(28329): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void java.net.DatagramSocket.send(java.net.DatagramPacket)' on a null object reference
    E/AndroidRuntime(28329):        at com.espressif.iot.esptouch.udp.UDPSocketClient.sendData(UDPSocketClient.java:100)
    E/AndroidRuntime(28329):        at com.espressif.iot.esptouch.udp.UDPSocketClient.sendData(UDPSocketClient.java:71)
    E/AndroidRuntime(28329):        at com.espressif.iot.esptouch.task.__EsptouchTask.executeForResults(__EsptouchTask.java:325)
    E/AndroidRuntime(28329):        at com.espressif.iot.esptouch.EsptouchTask.executeForResults(EsptouchTask.java:106)
    E/AndroidRuntime(28329):        at com.smaho.eng.esptouch.EspTouchTaskUtil$EspTouchAsyncTask.doInBackground(EspTouchTaskUtil.java:75)
    E/AndroidRuntime(28329):        at com.smaho.eng.esptouch.EspTouchTaskUtil$EspTouchAsyncTask.doInBackground(EspTouchTaskUtil.java:33)
    E/AndroidRuntime(28329):        at android.os.AsyncTask$3.call(AsyncTask.java:378)
    E/AndroidRuntime(28329):        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    

    However when on debug mode the app runs flawlessly. What could be the issue?

    opened by aguilaair 4
  • ESPtouch Issuse.

    ESPtouch Issuse.

    Null Safety and device count is not working. When two ESP are in on it is connected to two ESP's but for only one ESP the data is Going . Please Resolve it sir.

    opened by MaheshParuchuri 3
  • Unable to get working on iOS 15.1

    Unable to get working on iOS 15.1

    Hi, I've been unable to get this package working on iOS 15.1

    Currently, I have been able to set up permissions correctly and get the multicast entitlement connected with the application. Even after following all the steps from 16, this has not been working.

    I am concerned that whenever I call "flutter run", that the code signing that occurs there overrides the extra code-signing that was specified within the multicast setup thread.

    Are the any steps I may be missing? Alongside that, is there anything that I can do to actually debug where the issue may lie as my app currently runs fine but just cannot connect to my ESP8266.

    opened by rroessler 2
  • How to send some other info with ip adress

    How to send some other info with ip adress

    Hello,

    When i connected successfully i see the ip adress of the module and the bssid information on my app.

    How can i send some other information to app alongside the ip and bssid when connected successfully?

    opened by mralperem 2
  • iOS 16 issues?

    iOS 16 issues?

    This is an email that I got:

    I got some users reporting app was not working to find the ESP devices anymore. Investigating I realized they updated iPhones iOS version from 15 to iOS 16 and this is the issue. For some reason your lib is not working anymore on iOS 16.

    I couldn't verify it yet, but in case someone is able to provide more info, this ticket would be the right place.

    opened by vincevargadev 1
  • Sometimes the device is not connecting

    Sometimes the device is not connecting

    Hey,

    Sometimes the device is not connecting and also multiple devices are not scanning/connecting. I have also tried esptouch_flutter 1.1.0-androidv2, but the result is the same.

    esptouch_flutter: ^1.0.0 and esptouch_flutter 1.1.0-androidv2 Flutter SDK Version- 2.16.1 Android Version- 10/11/12

    Note-: Can you please provide some updates because we are facing that issue in our live application?

    opened by kcs-dileeppatel 1
  • Multiple device not scanning

    Multiple device not scanning

    Hey,

    Multiple devices are not scanning, every time it's scanning only 1 device at a time.

    esptouch_flutter: ^1.0.0 Flutter SDK Version- 2.16.1 Android Version- 10

    opened by kcs-dileeppatel 1
  • Cannot connect after entering the password incorrectly

    Cannot connect after entering the password incorrectly

    Hey,

    When I try to connect via the example from Github it works fine. However, there is one case where an error occurs:

    If I enter a password that is wrong it will output "no devices found" after a minute. Then it goes back one page and when I enter the correct password, it still aborts after a minute and displays "no devices found". Does anyone know what to do?

    Version: 1.69.1 (user setup) Date: 2022-07-12T08:21:24.514Z Electron: 18.3.5 Chromium: 100.0.4896.160 Node.js: 16.13.2 V8: 10.0.139.17-electron.0 OS: Windows_NT x64 10.0.19044

    opened by Takrem1 1
  • Changing minSDK to 19 will break the callback listener

    Changing minSDK to 19 will break the callback listener

    I have changed the minSDK of android to 19 instead of 16 due to breaking features in newer versions of firbase libraries.

    After changing the minSDK, esptouch stopped from detecting a successful wifi paring with esp8266.

    I returned to minSDK 16, it worked fine again.

    opened by hhyari 0
Releases(app-v0.1.5)
  • app-v0.1.5(Nov 12, 2019)

    This release includes the example app for the esptouch_flutter package.

    The example app is built as .apk and can be installed on Android devices.

    For other formats (ios, appbundle, etc...), clone the project and build the example app. If you have questions, observations, recommendations, open an issue: https://github.com/smaho-engineering/esptouch_flutter/issues/new

    Source code(tar.gz)
    Source code(zip)
    esptouch_flutter_-_app-v0.1.5.apk(10.76 MB)
Owner
SMAHO Engineering OSS
simply. smart. home.
SMAHO Engineering OSS
Purpose of this project is to create extendable architecture of making platform aware Widgets which automatically select platform specific implementation

Old good factory Main obstacle in creating native experience on Flutter is the fact that you are asked to rebuild two layouts using platform specific

Swav Kulinski (Robotoaster) 101 Oct 14, 2022
A wrapper around our Cocoa and Java client library SDKs, providing iOS and Android support for those using Flutter and Dart.

Ably Flutter Plugin A Flutter plugin wrapping the ably-cocoa (iOS) and ably-java (Android) client library SDKs for Ably, the platform that powers sync

Ably Realtime - our client library SDKs and libraries 46 Dec 13, 2022
Encode App-Dev is a open source project which contains different projects of Application development, Android development, IOS development, Flutter, Kotlin, Dart, Java, Swift etc.

HACKTOBERFEST 2022 Encode App-Dev is an open source project which contains different projects of Application development, Android development, IOS dev

null 4 Dec 4, 2022
Target the specific design of Material for Android and Cupertino for iOS widgets through a common set of Platform aware widgets

Flutter Platform Widgets This project is an attempt to see if it is possible to create widgets that are platform aware. Currently in order to render t

null 1.3k Jan 4, 2023
Target the specific design of Material for Android and Cupertino for iOS widgets through a common set of Platform aware widgets

Flutter Platform Widgets This project is an attempt to see if it is possible to create widgets that are platform aware. Currently in order to render t

null 1.3k Jan 4, 2023
An unofficial Flutter plugin that wraps pusher-websocket-java on Android and pusher-websocket-swift on iOS

Pusher Flutter Client An unofficial Flutter plugin that wraps pusher-websocket-java on Android and pusher-websocket-swift on iOS. Get it from pub. How

HomeX 31 Oct 21, 2022
The prime objective of this app is to store the real time information of the user using firebase cloud firestore and also can delete, remove and update the customer information

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

Muhammad Zakariya 0 Mar 15, 2022
Drag and Drop for Dart web apps with mouse and touch support.

Dart Drag and Drop Drag and Drop for Dart web apps with mouse and touch support. GitHub | Pub | Demos and Examples Features Use any HTML Element as Dr

Marco Jakob 136 Nov 18, 2022
Flutter plugin that secures your secrets in keychain using biometric authentication (Fingerprint, Touch ID, Face ID...).

Flutter Locker ?? Flutter plugin that secures your secrets in keychain using biometric authentication (Fingerprint, Touch ID, Face ID...). It uses: Lo

Infinum 25 Nov 21, 2022
Alarm app where user setting with touch gesture by moving the hand clock

Alarm App Using Flutter Flutter alarm app where user setting with touch gesture by moving the hand clock How to run Clone this repository Run flutter

null 3 Sep 3, 2022
Parallax - A parallax package for touch-based devices, providing a visually appealing user experience

Parallax A parallax package for touch-based devices, providing a visually appeal

MEDAFOX 4 Sep 28, 2022
This app can solve your problem! Play with fluids with a touch of your fingers

Feel bored or anxious? This app can solve your problem! Play with fluids with a touch of your fingers. Play and experiment with these swirling substances. Gorgeous visuals will take your breath away and help you to relieve stress.

Naser 17 Dec 30, 2022
Permission plugin for Flutter. This plugin provides a cross-platform (iOS, Android) API to request and check permissions.

Flutter permission_handler plugin The Flutter permission_handler plugin is build following the federated plugin architecture. A detailed explanation o

Baseflow 1.7k Dec 31, 2022
Test flutter~android specific channels

test_platform_channels Test platform specific channels on java Async Communication through platform channels can be produced by using FlutterEngine an

Scrappers Team 1 Mar 25, 2022
WooCommerce App template that uses Flutter. Integrated to work with WooCommerce stores, connect and create an IOS and Android app from Flutter for IOS and Android

WooCommerce App: Label StoreMax Label StoreMax - v5.3.1 Official WooSignal WooCommerce App About Label StoreMax Label StoreMax is an App Template for

WooSignal 314 Jan 9, 2023
Package your Flutter app into OS-specific bundles (.dmg, .exe, etc.) via Dart or the command line.

flutter_distributor Package your Flutter app into OS-specific bundles (.dmg, .exe, etc.) via Dart or the command line. The flutter_distributor source

LeanFlutter 416 Dec 24, 2022
The domain specific language in dart for flutter widgets.

Rettulf !esrever ni stegdiw etirW Getting started import 'package:rettulf/rettulf.dart'; void main() => const MyApp().runAsApp(); class MyApp extend

Li plum 4 Dec 21, 2022
Dart library for some Turkish language specific operations.

turkish This library provides these functions for Turkish language for Dart: Converting strings to lower, upper and title case. Regular and ignore cas

Ahmet A. Akın 39 Dec 27, 2022