Flutter数据库交互插件supabase_hooks的使用

Flutter数据库交互插件supabase_hooks的使用

Unofficial Supabase生命周期适配器,用于flutter_hooks。 可以在原始包中查看更多信息: https://github.com/supabase/supabase-flutter

注意:此库完全处于实验阶段,不建议在生产环境中使用。

与LifeHook相同,除了你可以覆盖更多特定于Supabase认证生命周期的方法。

AuthRequiredState useAuthRequiredState({
  required final NavigatorState navigator,
}) => use(
      LifeHook(
        debugLabel: 'AuthRequiredState',
        state: AuthRequiredState(
          navigator: navigator,
        ),
      ),
    );

class AuthRequiredState extends SupabaseAuthRequiredLifeState {
  AuthRequiredState({
    required this.navigator,
  });
  final NavigatorState navigator;
  [@override](/user/override)
  void onUnauthenticated() {
    /// 用户如果注销将被重定向到LoginPage。
    if (mounted) {
      /// 用户如果注销将被重定向到LoginPage。
      navigator
          .pushNamedAndRemoveUntil('/login', (final route) => false);
    }
  }
}

或者使用:

AuthState useAuthState({
  required NavigatorState navigator,
}) => use(
      LifeHook(
        debugLabel: 'AuthState',
        state: AuthState(
          navigator: navigator,
        ),
      ),
    );

class AuthState extends SupabaseAuthLifeState {
  AuthState({
    required this.navigator,
  });
  final NavigatorState navigator;
  [@override](/user/override)
  void onUnauthenticated() {
    if (mounted) {
      navigator
          .pushNamedAndRemoveUntil('/', (final route) => false);
    }
  }

  [@override](/user/override)
  void onAuthenticated(final Session session) {
    if (mounted) {
      navigator
          .pushNamedAndRemoveUntil('/', (final route) => false);
    }
  }

  [@override](/user/override)
  void onPasswordRecovery(final Session session) {}

  [@override](/user/override)
  void onErrorAuthenticating(final String message) {
    navigator.context.showErrorSnackBar(message: message);
  }
}

示例代码

以下是一个完整的示例,展示了如何在Flutter应用中使用supabase_hooks插件进行认证状态管理。

主文件 main.dart

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Supabase.initialize(
    url: 'https://your-supabase-url.supabase.co',
    anonKey: 'your-anon-key',
  );
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AuthWrapper(),
    );
  }
}

class AuthWrapper extends HookWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    final authState = useAuthState(navigator: Navigator.of(context));

    return authState.maybeWhen(
      authenticated: () => HomePage(),
      unauthenticated: () => LoginPage(),
      orElse: () => LoadingPage(),
    );
  }
}

class HomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Home Page'),
      ),
      body: Center(
        child: Text('Welcome to Home Page!'),
      ),
    );
  }
}

class LoginPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Login Page'),
      ),
      body: Center(
        child: Text('Please login to continue.'),
      ),
    );
  }
}

class LoadingPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Loading Page'),
      ),
      body: Center(
        child: CircularProgressIndicator(),
      ),
    );
  }
}

更多关于Flutter数据库交互插件supabase_hooks的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据库交互插件supabase_hooks的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用supabase_hooks插件与Supabase数据库进行交互的代码示例。supabase_hooks是一个Flutter包,它提供了方便的React Hook风格的API来与Supabase进行交互。请注意,supabase_hooks本身是基于supabase包的,因此你通常需要同时使用这两个包。

首先,确保你已经在pubspec.yaml文件中添加了必要的依赖项:

dependencies:
  flutter:
    sdk: flutter
  supabase: ^latest_version  # 请替换为最新版本号
  supabase_hooks: ^latest_version  # 请替换为最新版本号

然后,运行flutter pub get来安装这些依赖项。

接下来,你需要设置Supabase客户端。在你的Flutter应用中,通常会在一个单独的文件(例如supabase_client.dart)中初始化Supabase客户端:

import 'package:supabase/supabase.dart';

final SupabaseClient supabase = SupabaseClient(
  url: 'YOUR_SUPABASE_URL',  // 替换为你的Supabase实例URL
  anonKey: 'YOUR_ANON_KEY',  // 替换为你的Supabase匿名密钥
);

现在,你可以在你的Flutter组件中使用supabase_hooks来与数据库交互。以下是一个简单的示例,展示如何使用useSupabaseClientuseSupabaseTable钩子:

import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:supabase_hooks/supabase_hooks.dart';
import 'supabase_client.dart';  // 导入你创建的Supabase客户端文件

void main() {
  runApp(ProviderScope(child: MyApp()));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Supabase Hooks Example'),
        ),
        body: Center(
          child: MyHomePage(),
        ),
      ),
    );
  }
}

class MyHomePage extends HookWidget {
  @override
  Widget build(BuildContext context) {
    // 使用useSupabaseClient钩子获取Supabase客户端
    final supabaseClient = useSupabaseClient(supabase);

    // 使用useSupabaseTable钩子获取特定的表
    final postsTable = useSupabaseTable('posts', client: supabaseClient);

    // 使用useSupabaseQuery钩子执行一个查询
    final posts = useSupabaseQuery(
      () => postsTable.select().execute(),
    );

    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text('Posts:'),
        ...posts.data?.map((post) => Text(post['title'].toString())).toList() ?? [],
      ],
    );
  }
}

在这个示例中:

  1. 我们使用useSupabaseClient钩子来获取一个已经初始化的Supabase客户端实例。
  2. 使用useSupabaseTable钩子来获取对特定表(在这个例子中是posts表)的引用。
  3. 使用useSupabaseQuery钩子来执行一个查询,并获取结果。这里,我们查询posts表中的所有记录,并显示每个记录的标题。

请注意,这个示例假设你的Supabase数据库中有一个名为posts的表,并且该表有一个title字段。根据你的实际数据库结构,你可能需要调整这个示例中的代码。

此外,supabase_hooks包中的钩子可以与Riverpod一起使用,如上面的示例所示。如果你不熟悉Riverpod,它是一个流行的Flutter状态管理库,它提供了依赖注入和响应式状态管理的功能。

希望这个示例能帮助你理解如何在Flutter中使用supabase_hooks与Supabase数据库进行交互!

回到顶部