更新到 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类/方法#
SupabaseAuthState
和SupabaseAuthRequiredState
类的用法#
在v0中,SupabaseAuthState
和SupabaseAuthRequiredState
是用来处理自动令牌刷新和监听认证状态变化的。在v1版本中,SupabaseAuthState
和SupabaseAuthRequiredState
被弃用,令牌刷新将通过初始化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);
用 magic link登录#
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);