Flutter Laravel SDK集成插件sharara_laravel_sdk的使用

Flutter Laravel SDK集成插件sharara_laravel_sdk的使用

Api Package for flutter apps to handle general laravel requests and responses

在本教程中,我们将展示如何在Flutter应用程序中集成sharara_laravel_sdk插件,并通过一个完整的示例演示其使用方法。sharara_laravel_sdk 是一个强大的插件,可以帮助开发者轻松处理与Laravel后端的API请求和响应。


使用步骤

1. 添加依赖

首先,在您的pubspec.yaml文件中添加sharara_laravel_sdk依赖:

dependencies:
  sharara_laravel_sdk: ^版本号

然后运行以下命令安装依赖:

flutter pub get

2. 初始化SDK

在应用程序启动时,调用LaravelSDKInitializer初始化SDK。以下是初始化代码示例:

import 'package:sharara_laravel_sdk/sharara_laravel_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化Hive数据库(如果使用)
  await Hive.initFlutter();

  // 初始化SDK
  await LaravelSDKInitializer.initialize(
    configurations: () => LaravelConfigurations(
      logoPath: "",
      appName: "MyApp",
      appLogo: () => RoyalShadowContainer(
        backgroundColor: RoyalColors.mainAppColor,
        child: const Text("LOGO", style: TextStyle(color: RoyalColors.white)),
      ),
      mainApiUrl: "http://your-laravel-api-url.com/api",
    ),
  );

  // 设置默认HTTP头
  ShararaHttp.defaultHeaders = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer your_api_token",
  };

  runApp(
    LaravelAppBuilder(
      builder: (_) => const FirstScreen(),
    ),
  );
}

3. 创建数据模型

创建一个继承自GeneralLaravelModel的数据模型类。例如,定义一个CategoryModel类来表示分类数据:

class CategoryModel extends GeneralLaravelModel {
  String? name;

  CategoryModel.fromJson(super.parsed) : super.fromJson();

  [@override](/user/override)
  void buildModelProperties() {
    name = get("name"); // 从JSON解析出字段
  }
}

4. 分页数据获取

使用LaravelPaginationProvider获取分页数据。例如,从后端获取分类列表并展示在UI中:

class CategoryPaginationProvider extends LaravelPaginationProvider<CategoryModel> {
  CategoryPaginationProvider()
      : super(
          builder: CategoryModel.fromJson,
          url: "categories", // API路由
          mixFiltersResults: true,
          filters: [
            LaravelFilter(
              name: "按时间排序(升序)",
              query: LaravelQueryBuilder.create.orderBy("created_at", value: "ASC"),
            ),
            LaravelFilter(
              name: "按时间排序(降序)",
              query: LaravelQueryBuilder.create.orderBy("created_at", value: "DESC"),
            ),
          ],
          searchByFilters: [
            LaravelSearchFilter(
              column: "name",
              filter: LaravelFilter(name: "按名称搜索", query: LaravelQueryBuilder.create),
            ),
            LaravelSearchFilter(
              column: "status",
              filter: LaravelFilter(name: "按状态搜索", query: LaravelQueryBuilder.create),
            ),
          ],
        );
}

5. 构建UI

使用LaravelIterableBuilder构建分页列表,并结合RoyalShadowContainer美化UI:

class FirstScreen extends StatefulWidget {
  const FirstScreen({super.key});

  [@override](/user/override)
  State<FirstScreen> createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  final CategoryPaginationProvider provider = CategoryPaginationProvider();

  [@override](/user/override)
  void initState() {
    provider.init(); // 初始化分页数据
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: ElevatedButton(
          onPressed: () => FunctionHelpers.jumpTo(context, const ShararaThemePicker()),
          child: const Text("设置"),
        ),
        actions: [
          ElevatedButton(
            onPressed: () => LaravelFiltersUiBuilder.showFilter(context, provider),
            child: const Text("筛选"),
          ),
          ElevatedButton(
            onPressed: () => FunctionHelpers.jumpTo(
              context,
              RequiredAuthScreen<AuthUser>(
                userBuilder: (context, user) {
                  return Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Center(child: Text(user.name ?? "")),
                      const SizedBox(height: 16),
                      RoyalRoundedButton(
                        title: "登出",
                        onPressed: () => AuthProvider.instance.logout(),
                      ),
                    ],
                  );
                },
              ),
            ),
            child: const Text("注册"),
          ),
        ],
      ),
      body: LaravelIterableBuilder(
        provider: provider,
        showLoadMoreOnTheEndOfItemBuilder: true,
        builder: (context, CategoryModel model, _) {
          return RoyalShadowContainer(
            key: UniqueKey(),
            margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 8),
            child: Text(model.name ?? ""),
          );
        },
      ),
    );
  }
}

完整示例代码

以下是完整的示例代码:

import 'package:example/api.dart';
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
import 'package:sharara_laravel_sdk/sharara_laravel_sdk.dart';
import 'package:sharara_laravel_sdk/http.dart';
import 'package:sharara_laravel_sdk/ui.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();
  await LaravelSDKInitializer.initialize(
    configurations: () => LaravelConfigurations(
      logoPath: "",
      appName: "test",
      appLogo: () => RoyalShadowContainer(
        backgroundColor: RoyalColors.mainAppColor,
        child: const Text("LOGO", style: TextStyle(color: RoyalColors.white)),
      ),
      mainApiUrl: "http://192.168.0.190/dev/general/public",
    ),
  );
  ShararaHttp.defaultHeaders = {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "Authorization": "Bearer your_api_token",
  };
  runApp(
    LaravelAppBuilder(
      builder: (_) => const FirstScreen(),
    ),
  );
}

class FirstScreen extends StatefulWidget {
  const FirstScreen({super.key});

  [@override](/user/override)
  State<FirstScreen> createState() => _FirstScreenState();
}

class _FirstScreenState extends State<FirstScreen> {
  final CategoryPaginationProvider provider = CategoryPaginationProvider();

  [@override](/user/override)
  void initState() {
    provider.init();
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: ElevatedButton(
          onPressed: () => FunctionHelpers.jumpTo(context, const ShararaThemePicker()),
          child: const Text("设置"),
        ),
        actions: [
          ElevatedButton(
            onPressed: () => LaravelFiltersUiBuilder.showFilter(context, provider),
            child: const Text("筛选"),
          ),
          ElevatedButton(
            onPressed: () => FunctionHelpers.jumpTo(
              context,
              RequiredAuthScreen<AuthUser>(
                userBuilder: (context, user) {
                  return Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Center(child: Text(user.name ?? "")),
                      const SizedBox(height: 16),
                      RoyalRoundedButton(
                        title: "登出",
                        onPressed: () => AuthProvider.instance.logout(),
                      ),
                    ],
                  );
                },
              ),
            ),
            child: const Text("注册"),
          ),
        ],
      ),
      body: LaravelIterableBuilder(
        provider: provider,
        showLoadMoreOnTheEndOfItemBuilder: true,
        builder: (context, CategoryModel model, _) {
          return RoyalShadowContainer(
            key: UniqueKey(),
            margin: const EdgeInsets.symmetric(vertical: 10, horizontal: 8),
            child: Text(model.name ?? ""),
          );
        },
      ),
    );
  }
}

class CategoryModel extends GeneralLaravelModel {
  String? name;
  CategoryModel.fromJson(super.parsed) : super.fromJson();
  [@override](/user/override)
  void buildModelProperties() {
    name = get("name");
  }
}

class CategoryPaginationProvider extends LaravelPaginationProvider<CategoryModel> {
  CategoryPaginationProvider()
      : super(
          builder: CategoryModel.fromJson,
          url: "categories",
          mixFiltersResults: true,
          filters: [
            LaravelFilter(
              name: "按时间排序(升序)",
              query: LaravelQueryBuilder.create.orderBy("created_at", value: "ASC"),
            ),
            LaravelFilter(
              name: "按时间排序(降序)",
              query: LaravelQueryBuilder.create.orderBy("created_at", value: "DESC"),
            ),
          ],
          searchByFilters: [
            LaravelSearchFilter(
              column: "name",
              filter: LaravelFilter(name: "按名称搜索", query: LaravelQueryBuilder.create),
            ),
            LaravelSearchFilter(
              column: "status",
              filter: LaravelFilter(name: "按状态搜索", query: LaravelQueryBuilder.create),
            ),
          ],
        );
}

更多关于Flutter Laravel SDK集成插件sharara_laravel_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Laravel SDK集成插件sharara_laravel_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


sharara_laravel_sdk 是一个用于在 Flutter 应用中与 Laravel 后端进行集成的 SDK 插件。它提供了一些便捷的方法来处理身份验证、API 请求等常见的后端交互任务。

以下是如何在 Flutter 项目中集成和使用 sharara_laravel_sdk 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 sharara_laravel_sdk 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  sharara_laravel_sdk: ^1.0.0  # 使用最新的版本号

然后运行 flutter pub get 来安装依赖。

2. 初始化 SDK

在你的 Flutter 应用中,你需要在应用启动时初始化 sharara_laravel_sdk

import 'package:sharara_laravel_sdk/sharara_laravel_sdk.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化 SDK
  ShararaLaravelSdk.initialize(
    baseUrl: 'https://your-laravel-backend.com', // 你的 Laravel 后端地址
  );

  runApp(MyApp());
}

3. 进行身份验证

sharara_laravel_sdk 提供了简单的方法来处理用户登录和注册。

用户登录

try {
  final response = await ShararaLaravelSdk.instance.auth.login(
    email: 'user@example.com',
    password: 'password',
  );

  print('Login successful: ${response.user.name}');
} catch (e) {
  print('Login failed: $e');
}

用户注册

try {
  final response = await ShararaLaravelSdk.instance.auth.register(
    name: 'John Doe',
    email: 'john@example.com',
    password: 'password',
  );

  print('Registration successful: ${response.user.name}');
} catch (e) {
  print('Registration failed: $e');
}

4. 发送 API 请求

sharara_laravel_sdk 还提供了一个 HttpClient 类来发送自定义的 API 请求。

try {
  final response = await ShararaLaravelSdk.instance.httpClient.get('/api/posts');

  print('Posts: ${response.data}');
} catch (e) {
  print('Failed to fetch posts: $e');
}

5. 处理错误

sharara_laravel_sdk 会自动处理常见的错误,例如网络错误、身份验证错误等。你可以通过 try-catch 块来捕获这些错误并进行处理。

try {
  final response = await ShararaLaravelSdk.instance.auth.login(
    email: 'user@example.com',
    password: 'wrongpassword',
  );
} on ApiException catch (e) {
  print('API error: ${e.message}');
} on NetworkException catch (e) {
  print('Network error: ${e.message}');
} catch (e) {
  print('Unknown error: $e');
}

6. 注销用户

你可以使用 logout 方法来注销当前用户。

await ShararaLaravelSdk.instance.auth.logout();

7. 获取当前用户

你可以通过 currentUser 属性来获取当前登录的用户。

final user = ShararaLaravelSdk.instance.auth.currentUser;

if (user != null) {
  print('Logged in as: ${user.name}');
} else {
  print('No user is logged in.');
}

8. 刷新 Token

如果你的应用使用 JWT 进行身份验证,你可以使用 refreshToken 方法来刷新过期的 Token。

try {
  await ShararaLaravelSdk.instance.auth.refreshToken();
} catch (e) {
  print('Failed to refresh token: $e');
}

9. 使用 Interceptors

sharara_laravel_sdk 允许你添加自定义的拦截器来处理请求和响应。

ShararaLaravelSdk.instance.httpClient.addInterceptor((request) async {
  request.headers['Custom-Header'] = 'CustomValue';
  return request;
});

ShararaLaravelSdk.instance.httpClient.addResponseInterceptor((response) async {
  print('Response received: ${response.statusCode}');
  return response;
});

10. 配置 SDK

你可以在初始化时配置一些 SDK 的选项,例如超时时间、是否启用调试模式等。

ShararaLaravelSdk.initialize(
  baseUrl: 'https://your-laravel-backend.com',
  timeout: Duration(seconds: 30),
  debug: true,
);
回到顶部