A Dart client for Supabase

Overview

supabase-dart

A Dart client for Supabase.

pub package pub test


What is Supabase

Supabase is an open source Firebase alternative. We are a service to:

  • listen to database changes
  • query your tables, including filtering, pagination, and deeply nested relationships (like GraphQL)
  • create, update, and delete rows
  • manage your users and their permissions
  • interact with your database using a simple UI

Status

  • Alpha: Under heavy development
  • Public Alpha: Ready for testing. But go easy on us, there will be bugs and missing functionality.
  • Public Beta: Stable. No breaking changes expected in this version but possible bugs.
  • Public: Production-ready

Docs

supabase-dart mirrors the design of supabase-js. Find the documentation here.

Usage example

Database

import 'package:supabase/supabase.dart';

main() {
  final client = SupabaseClient('supabaseUrl', 'supabaseKey');

  // Select from table `countries` ordering by `name`
  final response = await client
      .from('countries')
      .select()
      .order('name', ascending: true)
      .execute();
}

Realtime

import 'package:supabase/supabase.dart';

main() {
  final client = SupabaseClient('supabaseUrl', 'supabaseKey');

  // Set up a listener to listen to changes in `countries` table
  final subscription = await client
      .from('countries')
      .on(SupabaseEventTypes.all, (payload) {
        // Do something when there is an update
      })
      .subscribe();

  // remember to remove subscription when you're done
  client.removeSubscription(subscription);
}

Realtime data as Stream

To receive relatime updates, you have to first enable Realtime on from your Supabase console. You can read more here on how to enable it.

import 'package:supabase/supabase.dart';

main() {
  final client = SupabaseClient('supabaseUrl', 'supabaseKey');

  // Set up a listener to listen to changes in `countries` table
  final subscription = await client
      .from('countries')
      .stream()
      .order('name')
      .limit(30)
      .execute()
      .listen(_handleCountriesStream);

  // remember to remove subscription when you're done
  subscription.cancel();
}

Authentication

import 'package:supabase/supabase.dart';

main() {
  final client = SupabaseClient('supabaseUrl', 'supabaseKey');

  // Sign up user with email and password
  final response = await client
      .auth
      .signUp('email', 'password');
}

Storage

import 'package:supabase/supabase.dart';

main() {
  final client = SupabaseClient('supabaseUrl', 'supabaseKey');

  // Create file `example.txt` and upload it in `public` bucket
  final file = File('example.txt');
  file.writeAsStringSync('File content');
  final storageResponse = await client
      .storage
      .from('public')
      .upload('example.txt', file);
}

Authentication

Initialize a SupabaseClient by passing your Supabase URL and Supabase KEY. The keys can be found in your supabase project in /setting/API.

final client = SupabaseClient('supabaseUrl', 'supabaseKey');

The client has a auth attribute (of type GoTrueClient) that you can use to authenticate your users using supabase.

Sign up

Use the signUp method, which returns a GotrueSessionResponse.

If the error attribute is null, the request was successful and the method returns data of type Session.

// Sign up user with email and password
final response = await client.auth.signUp('email', 'password');

if (response.error != null) {
  // Error
  print('Error: ${response.error?.message}');
} else {
  // Success
  final session = response.data;
}

Sign in

Use the signIn method. It works similar to the signUp method.

// Sign in user with email and password
final response = await client.auth.signIn(email: 'email', password: 'password');

if (response.error != null) {
  // Error
  print('Error: ${response.error?.message}');
} else {
  // Success
  final session = response.data;
}

Sign out

Use the signOut method, which returns a GotrueResponse.

Also for the sign out check that error is null to know if the request was successful.

// Sign out user
final response = await client.auth.signOut();

if (response.error != null) {
  // Error
  print('Error: ${response.error?.message}');
} else {
  // Success
}

Check out the Official Documentation to learn all the other available methods.

Guides

  • Flutter Supabase Authentication - Blog

Contributing

  • Fork the repo on GitHub
  • Clone the project to your own machine
  • Commit changes to your own branch
  • Push your work back up to your fork
  • Submit a Pull request so that we can review your changes and merge

License

This repo is licenced under MIT.

Credits

Comments
  • stream() does not work properly with nested StreamBuilders

    stream() does not work properly with nested StreamBuilders

    Bug report

    The Streambuilder doesn't update in real-time , it just do that when I add a new row to the table but when I update a row in the table , it doesn't update

    Screenshots

    https://user-images.githubusercontent.com/55693316/130299526-566d399d-4142-4451-a981-8fd10880baa8.MOV

    realtime 
    opened by akram-95 21
  • CERTIFICATE_VERIFY_FAILED on connection

    CERTIFICATE_VERIFY_FAILED on connection

    Hi.

    I use this:

    var key = 'secret...';
     client = SupabaseClient('https://tyzsguwlnxsbvfmbrrir.supabase.co', key);
    
    await client.storage.from('files').list();
    
    

    I see 'HandshakeException: Handshake error in client (OS Error: CERTIFICATE_VERIFY_FAILED: certificate has expired(handshake.cc:359))'

    This code worked before and has been wrong without change.

    what?

    bug 
    opened by ali-1989 15
  • RealtimeSubscription Unhandled Exception: type 'Null' is not a subtype of type 'List<dynamic>' in type cast

    RealtimeSubscription Unhandled Exception: type 'Null' is not a subtype of type 'List' in type cast

    Bug report

    When I listen to realtime events, and insert data to table, the supabase_realtime_payload.dart throws this exception.

    [VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: type 'Null' is not a subtype of type 'List<dynamic>' in type cast
    #0      new SupabaseRealtimePayload.fromJson.<anonymous closure> (package:supabase/src/supabase_realtime_payload.dart:36:35)
    supabase/supabase-flutter#1      WhereIterator.moveNext (dart:_internal/iterable.dart:439:13)
    supabase/supabase-flutter#2      MappedIterator.moveNext (dart:_internal/iterable.dart:390:19)
    supabase/supabase-flutter#3      new _GrowableList._ofOther (dart:core-patch/growable_array.dart:198:26)
    supabase/supabase-flutter#4      new _GrowableList.of (dart:core-patch/growable_array.dart:152:26)
    supabase/supabase-flutter#5      new List.of (dart:core-patch/array_patch.dart:50:28)
    supabase/supabase-flutter#6      Iterable.toList (dart:core/iterable.dart:388:12)
    supabase/supabase-flutter#7      new SupabaseRealtimePayload.fromJson (package:supabase/src/supabase_realtime_payload.dart:38:10)
    supabase/supabase-flutter#8      SupabaseRealtimeClient.on.<anonymous closure> (package:supabase/src/supabase_realtime_client.dart:35:57)
    supabase/supabase-flutter#9      RealtimeSubscription.trigger (package:realtime_client/src/realtime_subscription.dart:221:20)
    supabase/supabase-flutter#10     RealtimeClient.onConnMessage.<anonymous closure>.<anonymous closure> (package:realtime_client/src/realtime_client.dart:265:34)
    supabase/supabase-flutter#11     Iterable.forEach (dart:core/iterable.dart:279:35)
    supabase/supabase-flutter#12     RealtimeClient.onConnMessage.<anonymous closure> (package:realtime_client/src/realtime_client.dart:264:60)
    supabase/supabase-flutter#13     new RealtimeClient.<anonymous closure> (package:realtime_client/src/realtime_client.dart:86:21)
    supabase/supabase-flutter#14     RealtimeClient.onConnMessage (package:realtime_client/src/realtime_client.dart:249:11)
    supabase/supabase-flutter#15     RealtimeClient.connect.<anonymous closure> (package:realtime_client/src/realtime_client.dart:108:11)
    supabase/supabase-flutter#16     _rootRunUnary (dart:async/zone.dart:1436:47)
    supabase/supabase-flutter#17     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    supabase/supabase-flutter#18     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
    supabase/supabase-flutter#19     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
    supabase/supabase-flutter#20     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
    supabase/supabase-flutter#21     _ForwardingStreamSubscription._add (dart:async/stream_pipe.dart:123:11)
    supabase/supabase-flutter#22     _HandleErrorStream._handleData (dart:async/stream_pipe.dart:253:10)
    supabase/supabase-flutter#23     _ForwardingStreamSubscription._handleData (dart:async/stream_pipe.dart:153:13)
    supabase/supabase-flutter#24     _rootRunUnary (dart:async/zone.dart:1436:47)
    supabase/supabase-flutter#25     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    supabase/supabase-flutter#26     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
    supabase/supabase-flutter#27     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
    supabase/supabase-flutter#28     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
    supabase/supabase-flutter#29     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:733:19)
    supabase/supabase-flutter#30     _StreamController._add (dart:async/stream_controller.dart:607:7)
    supabase/supabase-flutter#31     _rootRunUnary (dart:async/zone.dart:1436:47)
    supabase/supabase-flutter#32     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    supabase/supabase-flutter#33     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
    supabase/supabase-flutter#34     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
    supabase/supabase-flutter#35     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
    supabase/supabase-flutter#36     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:733:19)
    supabase/storage-dart#16     _StreamController._add (dart:async/stream_controller.dart:607:7)
    supabase/supabase-flutter#38     _StreamController.add (dart:async/stream_controller.dart:554:5)
    supabase/supabase-flutter#39     new _WebSocketImpl._fromSocket.<anonymous closure> (dart:_http/websocket_impl.dart:1150:21)
    supabase/supabase-flutter#40     _rootRunUnary (dart:async/zone.dart:1436:47)
    supabase/supabase-flutter#41     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    supabase/supabase-flutter#42     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
    supabase/supabase-flutter#43     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
    supabase/supabase-flutter#44     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
    supabase/supabase-flutter#45     _SinkTransformerStreamSubscription._add (dart:async/stream_transformers.dart:63:11)
    supabase/supabase-flutter#46     _EventSinkWrapper.add (dart:async/stream_transformers.dart:13:11)
    supabase/supabase-flutter#47     _WebSocketProtocolTransformer._messageFrameEnd (dart:_http/websocket_impl.dart:338:23)
    supabase/supabase-flutter#48     _WebSocketProtocolTransformer.add (dart:_http/websocket_impl.dart:232:46)
    supabase/supabase-flutter#49     _SinkTransformerStreamSubscription._handleData (dart:async/stream_transformers.dart:111:24)
    supabase/supabase-flutter#50     _rootRunUnary (dart:async/zone.dart:1436:47)
    #51     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    #52     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
    #53     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
    #54     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
    #55     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:733:19)
    #56     _StreamController._add (dart:async/stream_controller.dart:607:7)
    #57     _StreamController.add (dart:async/stream_controller.dart:554:5)
    #58     _Socket._onData (dart:io-patch/socket_patch.dart:2166:41)
    #59     _rootRunUnary (dart:async/zone.dart:1436:47)
    #60     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
    #61     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
    #62     _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11)
    #63     _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7)
    #64     _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:733:19)
    #65     _StreamController._add (dart:async/stream_controller.dart:607:7)
    #66     _StreamController.add (dart:async/stream_controller.dart:554:5)
    #67     _RawSecureSocket._sendReadEvent (dart:io/secure_socket.dart:991:19)
    #68     _rootRun (dart:async/zone.dart:1420:47)
    #69     _CustomZone.run (dart:async/zone.dart:1328:19)
    #70     _CustomZone.runGuarded (dart:async/zone.dart:1236:7)
    #71     _CustomZone.bindCallbackGuarded.<anonymous closure> (dart:async/zone.dart:1276:23)
    #72     _rootRun (dart:async/zone.dart:1428:13)
    #73     _CustomZone.run (dart:async/zone.dart:1328:19)
    #74     _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:1260:23)
    #75     Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
    #76     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:395:19)
    #77     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:426:5)
    #78     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
    

    Reproduce

    Backend: https://github.com/supabase/supabase/tree/master/examples/nextjs-slack-clone

    Flutter

    // subscribe to messages
    _messageListener = client
            .from('messages')
            .on(SupabaseEventTypes.insert, (payload) => print('newRecord:${payload.newRecord}'))
            .subscribe();
    
    // insert message
    addMessage(String message, int channelId)async{
        final response = await client
            .from('messages')
            .insert({ 'message' : message, 'user_id':  client.auth.currentUser!.id, 'channel_id': channelId})
            .execute();
      }
    

    plugin version:

    • supabase: ^0.2.9
    • flutter sdk: ">=2.12.0 <3.0.0"
    • Platform: iOS 15.1
    bug 
    opened by offline-first 10
  • fix!: stream replaces the correct row

    fix!: stream replaces the correct row

    The stream method needs now the primary key as parameter to detect the updated row correctly.

    I've marked the primaryKeys list from 'SupabaseRealtimePayload' as deprecated, because it's on the new RLS Realtime server always empty.

    As far as I know, there aren't any Supabase instances running without RLS Realtime anymore, so I think it's okay to force that parameter and don't be backward compatible. We could remove primaryKeys instead of marking it deprecated, too.

    close #74, close #78

    opened by Vinzent03 8
  • chore: publish version 0.2.10

    chore: publish version 0.2.10

    What kind of change does this PR introduce?

    Publish version 0.2.10, which includes the following changes:

    • fix: type 'Null' is not a subtype of type 'List' in type cast
    opened by w3b6x9 8
  • Needed: Database Transaction handling for multiple database actions if any error occurred Rollback for data consistency.

    Needed: Database Transaction handling for multiple database actions if any error occurred Rollback for data consistency.

    Feature request

    Database Transaction handling for multiple database actions.

    Is your feature request related to a problem? Please describe.

    I need the transaction handling from supabase.io tech team as follow: Regarding BEGIN / COMMIT / ROLLBACK on Supabase, like:

    await supabase.transaction(
    supabase.from(...).insert(table1...),
    if any error, rollback.
    supabase.from(...).update(table2...)
    if any error, rollback.
    supabase.from(...).updata(table3...)
    if no error, Commit.
    )
    

    But I got answer from supabase.io tech team that no method to handle transaction. only rpc.

    I don't know how to really implement the correct rpc function for multiple database actions with complex arguments for database actions, including insert to the first table by multiple rows and then update the second table for different rows with different id and then update the third table for updating the data by key, if there is any error occurred during the THREE TABLEs transaction then ROLLBACK, otherwise COMMIT the transaction.

    Is there Any solution or suggestion for writing the correct rpc function to handle the multiple tables' operations(insert, update, ...) in one transaction which can make sure the data consistency?

    A clear and concise description of what you want and what your use case is.

    Describe the solution you'd like

    Regarding BEGIN / COMMIT / ROLLBACK on Supabase, like:

    await supabase.transaction(
      supabase.from(...).insert(table1...),
      // if any error, rollback.
      supabase.from(...).update(table2...)
      // if any error, rollback.
      supabase.from(...).updata(table3...)
      // if no error, Commit.
    )
    

    A clear and concise description of what you want to happen.

    Describe alternatives you've considered

    A clear and concise description of any alternative solutions or features you've considered.

    Additional context

    Add any other context or screenshots about the feature request here. Here is my Flutter sample code for multiple database actions:

    void addProduct(double amountSum) {
      // Todo: Begin transaction here
    
      // insert data into the first table: table_name1
      final response = await supabase.from('table_name1').insert([
            {'id': '1001', 'name': 'Apple', ‘price’: 5},
            {'id': '1002', 'name': 'Orange', ‘price’: 3},
            {'id': '1003', 'name': 'Pine Apple', ‘price’: 15},
            {'id': '1004', 'name': 'Water Melon', ‘price’: 10},
            {'id': '1005', 'name': 'Sweet Fruit', ‘price’: 5}
          ]).execute();
    
      if (response.error != null) {
        // Error occurred
        // Todo: Rollback transaction
      } else {
        // update data to the second table: table_name2 corresponding to
        // the products in the first table: table_name_1
    
        for (int i = 0; i < items.length; i++) {
          double newQuantity = table_name2.items[i].quantity + 
            table_name1.products[i].quantity;
    
          // update the second table: table_name2
          final response = await supabase
                .from(table_name2)
                .update({'quantity': newQuantity})
                .eq('id', items[i].id)
                .execute();
    
          if (response.error != null) {
            // Error occurred
            // Todo: break the for loop and Rollback transaction
          } else {
            // update the third table: table_name3 using the data 
            // amountSum  from outside
            double newAmount = table_name3.amount + amountSum; 
    
            // update the third table: table_name3
    
            final response = await supabase
                .from('table_name3'
                .update({'amount': newAmount})
                .eq('id', table_name3.id)
                .execute();
    
            if (response.error != null) {
              // Error catch.
              // Todo: Rollback transaction
            } else {
              // the database actions are all succeed
              // Todo: Commit transaction
            }
          }
        }
      }
    }
    
    enhancement 
    opened by JasonChiu-dev 8
  • Kong Error : No Api key found in request

    Kong Error : No Api key found in request

    Bug report

    Describe the bug

    I am trying to use flutter client of supabase to send a password reset link, however i am using "redirect to" param to redirect the user to my app, where i show my user the reset form. When the user clicks on reset link received in email, the user receives the error

    Which Link Do i receive ?

    https://[hidden-project-id].supabase.co/auth/v1/verify?token=zBhzNsGKt2ICKpaD6-zlrw&type=recovery&redirect_to=com.mobile.app://reset-callback/
    

    Where does the above link redirect to (when clicked) ?

    https://[hidden-project-id].supabase.co/auth/v1/com.mobile.app://reset-callback/#error_code=404&error_description=User+not+found
    

    Client reports no error and so far the user exists in the Dashboard > Auth > Users with the email.

    Note: I have already added the "redirect url" in my additional redirect urls, seperated by comma (since there are two) and i have also added the deep links

    To Reproduce

    Steps to reproduce the behavior, please provide code snippets or a repository:

    1. Use Supabase Flutter
    2. have a user registered using email
    3. reset password using .resetPasswordForEmail() function with redirect url as "com.app_name.etc://reset-callback"
    4. Receive the email
    5. Click the email link
    6. See Kong Error

    Expected behavior

    Link should redirect user to my app's deep link (as entered in redirect url param)

    Screenshots

    Untitled

    Url that causes this:

    https://[hidden-project-id].supabase.co/auth/v1/com.mobile.app://reset-callback/#error_code=404&error_description=User+not+found
    

    System information

    • OS: Android 11
    • Browser (Noop)
    • Version of supabase_flutter (^0.2.9)
    opened by dukesx 7
  • Feedback

    Feedback

    I'm trying to learn supabase and this is my feedback:

    • In the README, clicking in Database/Authentication/Storage takes me to Supabase docs. I want a link to storage-dart/postgrest-dart/etc. They contain additional samples in their README which I found helpful.

    • There is no realtime mention in the README.

    • There is no explanation why response has data but data is dynamic. When calling select.get(), it seems to always be an array. Documentation could mention its possible types.

    documentation 
    opened by bernaferrari 7
  • Add public download url of the asset in StorageResponse

    Add public download url of the asset in StorageResponse

    First of all, Thank you for this amazing project.

    Feature request

    • Add an option to get the public download URL for the uploaded asset just like firebase storage.

    Is your feature request related to a problem? Please describe.

    • Currently, when I upload the asset to my storage I need to save the relative path of the asset in the database and download the file when I need to show it in the Flutter app.
    • This is a problem especially when I need to show an image to a user as I cannot directly use it as a Network Image.

    Describe the solution you'd like

    • Ability to get the public URL of the file (just like the one I can copy from the storage console) from the upload response.

    Describe alternatives you've considered

    Currently, I use a future builder to download the image and show it to the user.

    Future<dynamic> downloadImage(String imagePath) {
        return _client.storage.from('journalImages').download(imagePath);
      }
    
    FutureBuilder(
          future: downloadImage(imagePath),
          builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
            if (!snapshot.hasData)
              return Center(
                child: CircularProgressIndicator(),
              );
    
            return Image.memory(
              snapshot.data.data,
              height: height,
            );
          },
        )
    

    Additional context

    • If this feature is lacking in the Supabase itself, I can move this issue to Supabase project.
    enhancement 
    opened by paurakhsharma 7
  • Making multiple subscriptions on the same client gets immediately CLOSED with error null

    Making multiple subscriptions on the same client gets immediately CLOSED with error null

    Bug report

    Describe the bug

    I have created a table countries with a single field name. In the following gist, when I comment out either _subOnCountriesDelete or _subOnCountriesInsert, everything works as intended and I receive events during the 10 seconds. But when I don't comment out anything in the gist, both the subscriptions just return event: CLOSED error: null.

    To Reproduce

    This gist

    Expected behavior

    The expected behavior is that the subscription should only end when removeSubscription() is called.

    System information

    • OS: EndlessOS
    • Version of supabase-dart: "0.0.1-dev.8"

    Additional context

    this

    bug 
    opened by happy-san 7
  • Int column turned to String in realtime listening (for one row)

    Int column turned to String in realtime listening (for one row)

    Bug report

    Describe the bug

    After getting the RealtimeSubscription Unhandled Exception: type 'Null' is not a subtype of type 'List' in type cast error and fixing it, im fed up again, if I get realtime data from my user profile (which is discriminated with the :id=eq.$userId) every column that is an int gets converted to a String in dart;

    To Reproduce

    Pretty much said this, just need a table, and listen two only two one row, and all int columns won't be int in dart but a string

    Expected behaviour

    Obviously not have an error with the type conversion

    Screenshots

    If applicable, add screenshots to help explain your problem.

    System information

    • OS: [e.g. macOS, Windows]
    • Browser (if applies) [e.g. chrome, safari]
    • Version of supabase-dart: newest (the one with the pull request)

    Additional context

    Please don't always roll out breaking changes, literally everything is breaking on this update.

    bug duplicate 
    opened by bit-burger 6
Owner
Supabase
Supabase
Supabase flutter user management demo app.

Supabase Flutter User Management This example will set you up for a very common situation: users can sign up with a magic link and then update their a

Hieu Pham 24 Dec 3, 2022
An eAsistent client Flutter package

easistent_client An eAsistent client Flutter package Usage // Login with username and password var login = await EAsClient.userLogin('username', 'pass

Jakob Kordež 4 Dec 21, 2021
Delhi Technological University unofficial website client app.

DTU-App Fast, responsive and good looking Delhi Technological University unofficial website client Introduction Apparently the official website of pre

Vishal Das 3 Jul 7, 2022
A Flutter Android Client for Kanboard

Khanos A Flutter Android Application for Kanboard A native app developed with Flutter framework which connects to the Kanboard API in your hosting or

José Aponte 40 Dec 24, 2022
WeeChat Relay Client for iOS and Android

weechat Weechat Relay Client for iOS and Android Getting Started This project is a starting point for a Flutter application. A few resources to get yo

nils 5 Nov 30, 2022
An open source Github client App developed by Flutter

English Readme 一款跨平台的开源Github客户端App,提供更丰富的功能,更好体验,旨在更好的日常管理和维护个人Github,

Shuyu Guo 13.7k Dec 31, 2022
A universal translate client.

uni_translate A universal translate client.

biyidev 16 Dec 12, 2022
gceditor - a client/server application for creating a persistent data of an application

gceditor - a client/server application for creating a persistent data of an application

Sergey Tarasenko 8 Dec 17, 2022
Cryptocurrency App with MVP Design Pattern to track all the coins data in realtime for android & iOS . Written in dart using Flutter SDK.

Flutter CryptoCurrency App (MVP) Cryptocurrency App with MVP design pattern to track all the coins data in realtime for android & iOS . Written in dar

Pawan Kumar 287 Dec 30, 2022
Quiz App to conduct online quiz developed with flutter framework and dart language

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

Parag Patil 7 Nov 8, 2022
This is the self learning of mine about Dart Language

Dart Tutorial These are dart files what iam self studied And I think to share my knowlage with others from sharing this repo as public Still Adding so

Madhusha Prasad 6 Nov 6, 2022
The objective of this tutorial is to learn about asynchronous programming in Dart.

The objective of this tutorial is to learn about asynchronous programming in Dart. We'll look at how to carry out time consuming tasks such as getting device location and networking to get data from the internet.

Hritik Kumar 1 Oct 5, 2021
Examples showing how to use Rid in order to build Dart/Flutter apps integrated with Rust.

Examples showing how to use Rid in order to build Dart/Flutter apps integrated with Rust.

Thorsten Lorenz 205 Dec 24, 2022
A pure dart SSH implementation based on dartssh, with bug fixes, up-to-date dependencies and sound null safety.

DartSSH 2 dartssh2 is a pure dart SSH implementation based on dartssh, with bug fixes, up-to-date dependencies and sound null safety. dartssh2 providi

null 100 Dec 29, 2022
A fully responsive BMI calculator app made using flutter and dart with beautiful minimalistic user interface design and easy to use .

BMI_Calculator_Flutter A fully responsive BMI calculator app made using flutter and dart with beautiful minimalistic user interface design and easy to

null 1 Oct 9, 2021
Exemplos e exercícios introdutórios de Dart

Dart Basics Aulas introdutórias e lógica de programação com Dart Introdução - Aplicações iniciais em Dart para reforçar a lógica de programação Contém

Erilândio Santos Medeiros 0 Jan 24, 2022
Package your Flutter app into OS-specific bundles (.app, .exe, etc.) via Dart or the command line.

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

LeanFlutter 415 Jan 8, 2023
Code collections for MI2S Dart lang study group.

MI2S Dart Language Study Group Code collections for MI2S Dart lang study group. Get started Install flutter (which contains the dart SDK). Clone the r

Michael Shih 2 Nov 10, 2021
BMI Calc in Flutter/Dart

BMI Calculator ?? Our Goal The objective of this tutorial is to look at how we can customise Flutter Widgets to achieve our own beautiful user interfa

Boris Barroso 0 Nov 1, 2021