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 realtime 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 Community
Supabase Community
Addons to supabase dart (and Flutter), to make development easier.

supabase_addons Make great apps with a great backend! Supabase is an open source Firebase alternative. It has support for auth, database and storage u

Bruno D'Luka 20 Dec 3, 2022
Flutter integration for Supabase. This package makes it simple for developers to build secure and scalable products.

supabase_flutter Flutter package for Supabase. What is Supabase Supabase is an open source Firebase alternative. We are a service to: listen to databa

Supabase 251 Jan 7, 2023
🎯 A powerful multiplatform application with Flutter and Supabase for the Komentory project.

?? Multiplatform application for Komentory project A powerful multiplatform application with Flutter and Supabase for the Komentory project. Currently

Komentory 3 Mar 1, 2022
A Flutter application to plan personal activities and routines that uses Supabase for the backend.

Flutter Planner Generated by the Very Good CLI ?? A Flutter application to plan personal activities and routines that uses Supabase for the backend. P

Ivan 15 Dec 29, 2022
UI library to easily implement auth functionalities of Supabase in your app.

flutter-auth-ui A simple library of predefined widgets to easily and quickly create a auth compooents using Flutter and Supabase. ⚠️ Developer Preview

Supabase Community 20 Dec 13, 2022
A Flutter mobile application built completely using DhiWise and Supabase without coding single line of code. With 100% system generated code

Flutter Expension Getting Started with Flutter ?? Generated with ❤️ from Dhiwise A Flutter mobile application built completely using DhiWise and Supab

DhiWise 11 Oct 23, 2022
An example Flutter application built with Very Good CLI and Supabase 🦄

Supabase Example Generated by the Very Good CLI ?? An example Flutter application built with Very Good CLI and Supabase ?? Getting Started ?? This pro

Very Good Ventures 46 Dec 27, 2022
A fully functional Furniture App Clone made using Flutter, Supabase and Getx State Management.

?? Flutter Furniture App ?? Timberr is a fully functional Furniture App Clone Developed using Flutter, Supabase and Getx State Management which is bas

Aditya 54 Nov 22, 2022
This is an example project for the article about implementing clean architecture in flutter with riverpod and supabase as backend service.

The Example This is an example how to implement clean architecture with domain driven design and riverpod in flutter projects. Getting Started Rename

Volodymyr Hodiak 45 Dec 30, 2022
A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package. Built after react apollo

Flutter GraphQL Table of Contents Flutter GraphQL Table of Contents About this project Installation Usage GraphQL Provider [Graphql Link and Headers]

Snowball Digital 45 Nov 9, 2022
A GraphQL client for Flutter, bringing all the features from a modern GraphQL client to one easy to use package.

GraphQL Flutter ?? Bulletin See the v3 -> v4 Migration Guide if you're still on v3. Maintenance status: Low. Follow #762 for updates on the planned ar

Zino & Co. 3.1k Jan 5, 2023
Vrchat mobile client - VRChat Unofficial Mobile Client For Flutter

VRChatMC VRChatの非公式なAPIを利用したVRChatのモバイルクライアント Flutterで作成されたシンプルなUIが特徴的です iosビルドは

ふぁ 8 Sep 28, 2022
Mysql.dart - MySQL client for Dart written in Dart

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

null 48 Dec 29, 2022
A Dart client for the NATS messaging system. Design to use with Dart and Flutter.

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

Chart Chongcharoen 32 Nov 18, 2022
Socketio dart server and client - Full Socket.io implementation using Dart Lang

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

Trần Thiên Trọng 1 Jan 23, 2022
Pure Dart Client for Nakama Server 🌟🥰🤩

Nakama Flutter Client ?? ?? ?? ?? Nakama is an open-source scalable game server. This is a Flutter client for Nakama written in pure dart and supports

Oliver Brunsmann 57 Dec 6, 2022
A streaming client for the Komga self-hosted comics/manga/BD server targeting Android/iOS written in Dart/Flutter

Klutter A streaming client for the Komga self-hosted comics/manga/BD server targeting Android/iOS written in Dart/Flutter Background This is a project

Mark Winckle 58 Dec 7, 2022
Dart client for Typesense

Typesense Dart client library for accessing the HTTP API of Typesense search engine. Note: This package is still under development. Version 0.2.0 will

Typesense 42 Dec 28, 2022