更新
supabase-flutter专注于改善开发者的体验,使其更容易使用。本指南将帮助你从supabase-flutter v0升级到v1。
更新你的pubspec.yaml文件中的软件包。
supabase-flutter抛出错误的方式在v1中有所改变。在v1中,错误是以异常形式抛出的。这使得作为Flutter开发者处理错误时更加直观。
final res = await supabase.from('my_table').select().execute();
final error = res.error;
if (error != null) {
// handle error
}
final data = res.data;
try {
final data = supabase.from('my_table').select();
} catch (error) {
// handle error
}
Auth类/方法 link SupabaseAuthState
和SupabaseAuthRequiredState
类的用法 link 在v0中,SupabaseAuthState
和SupabaseAuthRequiredState
是用来处理自动令牌刷新和监听认证状态变化的。在v1版本中,SupabaseAuthState
和SupabaseAuthRequiredState
被弃用,令牌刷新将通过初始化Supabase自动发生。onAuthStateChange
可以用来对auth状态的变化采取行动。
await Supabase.initialize(
url: 'SUPABASE_URL',
anonKey: 'SUPABASE_ANON_KEY',
);
...
class AuthState<T extends StatefulWidget> extends SupabaseAuthState<T> {
...
}
...
class AuthRequiredState<T extends StatefulWidget> extends SupabaseAuthState<T> {
...
}
await Supabase.initialize(
url: 'SUPABASE_URL',
anonKey: 'SUPABASE_ANON_KEY',
);
倾听认证状态的变化 link onAuthStateChange
现在返回一个Stream
。
final authSubscription = supabase.auth.onAuthStateChange((event, session) {
// handle auth state change
});
// Unsubscribe when no longer needed
authSubscription.data?.unsubscribe();
final authSubscription = supabase.auth.onAuthStateChange.listen((data) {
final AuthChangeEvent event = data.event;
final Session? session = data.session;
// handle auth state change
});
// Unsubscribe when no longer needed
authSubscription.cancel();
用电子邮件和密码登录 link signIn()方法已被废弃,转而采用更明确的方法签名来帮助类型提示。以前,开发者很难知道他们错过了什么(例如,很多开发者没有意识到他们可以使用无密码的magic links)。
await supabase.auth.signIn(email: email, password: password);
await supabase.auth.signInWithPassword(email: email, password: password);
用 magic link登录 link
await supabase.auth.signIn(email: email);
await supabase.auth.signInWithOtp(email: email);
用第三方OAuth提供商登录 link
await supabase.auth.signInWithProvider(
Provider.github,
options: AuthOptions(
redirectTo: kIsWeb
? null
: 'io.supabase.flutter://reset-callback/'),
);
await supabase.auth.signInWithOAuth(
Provider.github,
redirectTo: kIsWeb ? null : 'io.supabase.flutter://reset-callback/',
);
await supabase.auth.signIn(
phone: '+13334445555',
password: 'example-password',
);
await supabase.auth.signInWithPassword(
phone: '+13334445555',
password: 'example-password',
);
使用OTP用手机登录 link
final res = await supabase.auth.signIn(phone: phone);
await supabase.auth.signInWithOtp(
phone: phone,
);
// After receiving a SMS with a OTP.
await supabase.auth.verifyOTP(
type: OtpType.sms,
token: token,
phone: phone,
);
重置电子邮件的密码 link
await supabase.auth.api.resetPasswordForEmail(
email,
options:
AuthOptions(redirectTo: 'io.supabase.flutter://reset-callback/'),
);
await supabase.auth.resetPasswordForEmail(
email,
redirectTo: kIsWeb ? null : 'io.supabase.flutter://reset-callback/',
);
获取用户的当前会话 link
final session = supabase.auth.session();
final Session? session = supabase.auth.currentSession;
final user = supabase.auth.user();
final User? user = supabase.auth.currentUser;
更新已登录用户的用户数据 link
await supabase.auth.update(
UserAttributes(data: {'hello': 'world'})
);
await supabase.updateUser(
UserAttributes(
data: { 'hello': 'world' },
),
);
.insert()
/.upsert()
/.update()
/.delete()
默认不会返回记录。
以前,这些方法默认返回插入/更新/删除的行(这引起了一些混乱 ),你可以通过指定returning: 'minimal'
来选择不返回它。现在的默认行为是不返回记录。要返回插入/更新/删除的行,在最后添加一个.select()
的调用。
另外,在查询结束时调用.execute()
是v0中的一个要求,但在v1中.execute
已经过时了。
插入而不返回插入的数据 link
await supabase
.from('my_table')
.insert(data, returning: ReturningOption.minimal)
.execute();
await supabase.from('my_table').insert(data);
插入,并返回插入的数据 link
final res = await supabase
.from('my_table')
.insert(data)
.execute();
final insertedData = await supabase.from('my_table').insert(data).select();
##实时方法
.stream()
不再需要最后的.execute()
。另外,通过eq
过滤现在变得容易多了。primaryKey
现在是一个命名的参数,以使它更明显地传递什么。
supabase.from('my_table:id=eq.120')
.stream(['id'])
.listen();
supabase.from('my_table')
.stream(primaryKey: ['id'])
.eq('id', '120')
.listen();
Subscribe link
final subscription = supabase
.from('countries')
.on(SupabaseEventTypes.all, (payload) {
// Handle realtime payload
})
.subscribe();
final channel = supabase.channel('*');
channel.on(
RealtimeListenTypes.postgresChanges,
ChannelFilter(event: '*', schema: '*'),
(payload, [ref]) {
// Handle realtime payload
},
).subscribe();
Unsubscribe link
supabase.removeSubscription(subscription);
await supabase.removeChannel(channel);