Flutter自定义URL Schema处理插件schema_dart的使用
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 为特定表生成数据类
你可以指定要生成数据类的特定表。例如,生成 users
和 posts
表的数据类:
schema-dart -c <connection-string> -o <output-dir> -t "users","posts"
或者,如果你想要从 api
模式中生成 profiles
和 posts
表的数据类,可以使用以下命令:
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
更多关于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。注意,这只是一个示例,实际项目中可能需要根据具体需求进行调整。