Flutter自定义URL Schema处理插件schema_dart的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter自定义URL Schema处理插件schema_dart的使用

1. 插件简介

schema-dart 是一个用于从PostgreSQL数据库模式生成Dart类型定义的工具。它可以帮助开发者快速生成与数据库表结构对应的Dart类,从而简化数据模型的创建和维护。

2. 安装

要安装 schema-dart,请在终端中运行以下命令:

dart pub global activate schema_dart

3. 使用方法

3.1 生成公共模式的数据类(默认)

在Flutter项目目录下,运行以下命令以生成公共模式的数据类:

schema-dart -c postgresql://postgres:postgres@localhost:54322/postgres -o path/to/output/directory

3.2 为特定模式生成数据类

如果你想为名为 cms 的模式生成数据类,可以使用以下命令:

schema-dart -c <connection-string> -o <output-dir> -s cms

3.3 为特定表生成数据类

你可以指定要生成数据类的特定表。例如,生成 usersposts 表的数据类:

schema-dart -c <connection-string> -o <output-dir> -t "users","posts"

或者,如果你想要从 api 模式中生成 profilesposts 表的数据类,可以使用以下命令:

schema-dart -c <connection-string> -o <output-dir> --schema=api --tables="profiles","posts"

3.4 禁用SSL连接

如果你遇到以下错误:

Severity.error Server does not support SSL, but it was required.

你可以通过添加 --no-ssl 标志来禁用SSL连接(不推荐):

schema-dart --no-ssl -c <connection-string> -o <output-dir>

4. 全部使用信息

以下是 schema-dart 的全部使用信息:

Generate Data Classes for PostgreSQL schema

Examples: 

  # 生成公共模式的数据类(默认)
  schema-dart -c postgresql://postgres:postgres@localhost:54322/postgres -o path/to/output/directory

  # 为名为 "cms" 的模式生成数据类
  schema-dart -c <connection-string> -o <output-dir> -s cms

  # 为公共模式中的特定表生成数据类(格式敏感):
  schema-dart -c <connection-string> -o <output-dir> -t "users","posts"
  # 或者
  schema-dart -c <connection-string> -o <output-dir> --schema=api --tables="profiles","posts"

Usage: schema-dart <command> [arguments]

Global options:
-h, --help                 打印此使用信息。
-c, --connection-string    PostgreSQL连接字符串,格式如下:
                           postgresql://<username>:<password>@<host>:<port>/<database-name>
-o, --output-dir           生成的Dart文件的输出目录
-s, --schema               指定模式
                           (默认为 "public")
-t, --tables=<String>      提供要生成数据类的具体表列表。
                           (默认为所有表)
    --no-ssl               禁用PostgreSQL连接的SSL(不推荐)
-n, --nullable-fields      如果提供,生成的类中的所有字段都将为可空(适用于部分表查询和本地表构造更新/插入)
-i, --nullable-ids         如果提供,具有身份生成的列将生成为可空字段
-d, --nullable-defaults    如果提供,具有默认值的身份列将生成为可空字段
-v, --verbose              启用详细日志记录。
    --version              打印当前版本。

Available commands:
  help   显示 `schema-dart` 的帮助信息。

运行 "schema-dart help <command>" 以获取更多关于某个命令的信息。

5. 示例输出

example/sample_output 文件夹包含了一个从Supabase的 auth 模式生成的示例输出。你可以参考该文件夹中的内容来了解生成的Dart类的结构。

6. 完整示例Demo

假设你有一个名为 supabase 的数据库,并且你想为 auth 模式生成数据类。首先,确保你已经在本地启动了Supabase服务。然后,按照以下步骤操作:

6.1 安装 schema-dart

dart pub global activate schema_dart

6.2 生成数据类

在项目根目录下运行以下命令:

dart bin/schema_dart.dart -c postgresql://postgres:postgres@localhost:54322/postgres -o example/sample_output -s auth

6.3 查看生成的文件

生成的Dart类将保存在 example/sample_output 目录中。你可以打开这些文件,查看生成的类结构。例如,user.dart 文件可能看起来像这样:

// user.dart

class User {
  final String id;
  final String email;
  final String? phone; // 可空字段
  final DateTime createdAt;

  User({
    required this.id,
    required this.email,
    this.phone, // 可空字段
    required this.createdAt,
  });

  factory User.fromMap(Map<String, dynamic> map) {
    return User(
      id: map['id'] as String,
      email: map['email'] as String,
      phone: map['phone'] as String?,
      createdAt: DateTime.parse(map['created_at'] as String),
    );
  }

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'email': email,
      'phone': phone,
      'created_at': createdAt.toIso8601String(),
    };
  }
}

更多关于Flutter自定义URL Schema处理插件schema_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自定义URL Schema处理插件schema_dart的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter应用中,自定义URL Schema可以让你的应用通过特定的URL进行启动,并处理URL中的参数。schema_dart 是一个假设的插件名称(实际中,Flutter 并没有一个广泛使用的名为 schema_dart 的插件来处理自定义URL Schema,但我们可以基于类似功能的插件或手动实现一个类似的功能)。

下面是一个基于 Flutter 和原生代码(iOS 和 Android)的示例,展示如何实现自定义URL Schema的处理。

1. 配置 Flutter 项目

首先,确保你的 Flutter 项目已经创建并准备好。

2. 配置 iOS 项目

修改 Info.plist

ios/Runner/Info.plist 文件中,添加一个新的 URL type 配置:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>mycustomschema</string>
        </array>
    </dict>
</array>

AppDelegate.swift 中处理 URL

打开 ios/Runner/AppDelegate.swift 文件,并添加以下代码来处理 URL:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

  override func application(
    _ app: UIApplication,
    open url: URL,
    options: [UIApplication.OpenURLOptionsKey : Any] = [:]
  ) -> Bool {
    // 在这里处理自定义URL Schema
    if url.scheme == "mycustomschema" {
      let components = URLComponents(url: url, resolvingAgainstBaseURL: false)!
      let path = components.path
      let queryItems = components.queryItems ?? []
      
      // 假设我们有一个查询参数 `param`
      if let param = queryItems.first(where: { $0.name == "param" })?.value {
        print("Received URL with param: \(param)")
        
        // 传递参数到 Flutter
        let channel = FlutterMethodChannel(name: "com.example.myapp/custom_url_channel", binaryMessenger: self.flutterEngine!.binaryMessenger)
        channel.invokeMethod("handleCustomURL", arguments: ["param": param])
      }
      
      return true
    }
    return false
  }
}

3. 配置 Android 项目

修改 AndroidManifest.xml

android/app/src/main/AndroidManifest.xml 文件中,添加以下配置:

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="mycustomschema" android:host="*" />
</intent-filter>

通常,这个 intent-filter 会添加到你的 MainActivity 配置中,如下所示:

<activity
    android:name=".MainActivity"
    android:launchMode="singleTop"
    android:theme="@style/LaunchTheme"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:hardwareAccelerated="true"
    android:windowSoftInputMode="adjustResize">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="mycustomschema" android:host="*" />
    </intent-filter>
</activity>

MainActivity.kt 中处理 URL

打开 android/app/src/main/kotlin/com/yourcompany/yourapp/MainActivity.kt 文件(如果使用的是 Kotlin),并添加以下代码来处理 URL:

package com.yourcompany.yourapp

import android.content.Intent
import android.net.Uri
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
    private val CHANNEL = "com.example.myapp/custom_url_channel"

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            // 这里通常处理来自 Dart 的消息
        }
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        setIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        intent.data?.let { uri ->
            if (uri.scheme == "mycustomschema") {
                val param = uri.getQueryParameter("param")
                param?.let {
                    // 传递参数到 Flutter
                    MethodChannel(flutterEngine!!.dartExecutor.binaryMessenger, CHANNEL)
                        .invokeMethod("handleCustomURL", hashMapOf("param" to it))
                }
            }
        }
    }
}

4. 在 Flutter 中接收参数

最后,在 Flutter 中创建一个 Dart 方法来接收和处理从原生平台传递过来的参数:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  static const platform = MethodChannel('com.example.myapp/custom_url_channel');

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Custom URL Schema Example'),
        ),
        body: Center(
          child: Text('Waiting for custom URL...'),
        ),
      ),
    );
  }

  @override
  void initState() {
    super.initState();
    _handleCustomURL();
  }

  void _handleCustomURL() async {
    try {
      platform.setMethodCallHandler((call) async {
        if (call.method == "handleCustomURL") {
          final Map<String, dynamic> args = call.arguments as Map<String, dynamic>;
          print("Received custom URL with param: ${args['param']}");
          // 在这里处理接收到的参数
        }
      });
    } on PlatformException catch (e) {
      print("Failed to set platform message handler: '${e.message}'.");
    }
  }
}

以上代码展示了如何在 Flutter 应用中处理自定义URL Schema,并通过原生代码(iOS 和 Android)将URL参数传递给 Flutter。注意,这只是一个示例,实际项目中可能需要根据具体需求进行调整。

回到顶部