更新
                                                    
                                                 
                                            
                                            
                                            
                                                
    
    
        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
	
 
	
  
  
  
  
	
  
  
  
  
  
  
  
  
  
  
  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);