更新到 supabase-flutter v1

supabase-flutter专注于改善开发者的体验,使其更容易使用。本指南将帮助你从supabase-flutter v0升级到v1。

升级客户端库

更新你的pubspec.yaml文件中的软件包。

1supabase_flutter: ^1.0.0

错误处理

supabase-flutter抛出错误的方式在v1中有所改变。在v1中,错误是以异常形式抛出的。这使得作为Flutter开发者处理错误时更加直观。

1final res = await supabase.from('my_table').select().execute();
2final error = res.error;
3if (error != null) {
4  // handle error
5}
6final data = res.data;

Auth类/方法#

SupabaseAuthStateSupabaseAuthRequiredState类的用法#

在v0中,SupabaseAuthStateSupabaseAuthRequiredState是用来处理自动令牌刷新和监听认证状态变化的。在v1版本中,SupabaseAuthStateSupabaseAuthRequiredState被弃用,令牌刷新将通过初始化Supabase自动发生。onAuthStateChange可以用来对auth状态的变化采取行动。

1await Supabase.initialize(
2  url: 'SUPABASE_URL',
3  anonKey: 'SUPABASE_ANON_KEY',
4);
5...
6
7class AuthState<T extends StatefulWidget> extends SupabaseAuthState<T> {
8  ...
9}
10
11...
12
13class AuthRequiredState<T extends StatefulWidget> extends SupabaseAuthState<T> {
14  ...
15}

倾听认证状态的变化

onAuthStateChange现在返回一个Stream

1final authSubscription = supabase.auth.onAuthStateChange((event, session) {
2  // handle auth state change
3});
4
5// Unsubscribe when no longer needed
6authSubscription.data?.unsubscribe();

用电子邮件和密码登录

signIn()方法已被废弃,转而采用更明确的方法签名来帮助类型提示。以前,开发者很难知道他们错过了什么(例如,很多开发者没有意识到他们可以使用无密码的magic links)。

1await supabase.auth.signIn(email: email, password: password);
1await supabase.auth.signIn(email: email);

用第三方OAuth提供商登录#

1await supabase.auth.signInWithProvider(
2  Provider.github,
3  options: AuthOptions(
4      redirectTo: kIsWeb
5          ? null
6          : 'io.supabase.flutter://reset-callback/'),
7);

用手机登录

1await supabase.auth.signIn(
2  phone: '+13334445555',
3  password: 'example-password',
4);

使用OTP用手机登录#

1final res = await supabase.auth.signIn(phone: phone);

重置电子邮件的密码

1await supabase.auth.api.resetPasswordForEmail(
2  email,
3  options:
4      AuthOptions(redirectTo: 'io.supabase.flutter://reset-callback/'),
5);

获取用户的当前会话

1final session = supabase.auth.session();

获取登录的用户

1final user = supabase.auth.user();

更新已登录用户的用户数据

1await supabase.auth.update(
2  UserAttributes(data: {'hello': 'world'})
3);

数据方法

.insert()/.upsert()/.update()/.delete()默认不会返回记录。

以前,这些方法默认返回插入/更新/删除的行(这引起了一些混乱),你可以通过指定returning: 'minimal'来选择不返回它。现在的默认行为是不返回记录。要返回插入/更新/删除的行,在最后添加一个.select()的调用。

另外,在查询结束时调用.execute()是v0中的一个要求,但在v1中.execute已经过时了。

插入而不返回插入的数据

1await supabase
2  .from('my_table')
3  .insert(data, returning: ReturningOption.minimal)
4  .execute();

插入,并返回插入的数据

1final res = await supabase
2  .from('my_table')
3  .insert(data)
4  .execute();

##实时方法

Stream#

.stream()不再需要最后的.execute()。另外,通过eq过滤现在变得容易多了。primaryKey现在是一个命名的参数,以使它更明显地传递什么。

1supabase.from('my_table:id=eq.120')
2  .stream(['id'])
3  .listen();

Subscribe#

1final subscription = supabase
2  .from('countries')
3  .on(SupabaseEventTypes.all, (payload) {
4    // Handle realtime payload
5  })
6  .subscribe();

Unsubscribe#

1supabase.removeSubscription(subscription);