g_faraday_k

Last updated:

0 purchases

g_faraday_k Image
g_faraday_k Images
Add to Cart

Description:

g faraday k

Faraday English #




一个Flutter混合栈开发解决方案
Features #

✅ 支持ios、android、flutter三端所有原生路由(页面切换)跳转行为
✅ 支持混合栈(native -> flutter -> native)路由跳转(popTo、replace ...)
✅ 支持flutter页面作为root页面
✅ 支持flutter作为子页面加入原生堆栈
✅ 支持flutter作为弹出页面(背景透明到native层)
✅ 页面间回调传值完整支持
✅ iOS导航条自动隐藏/显示
✅ WillPopScope拦截滑动返回(ios)或者返回按键键(android)
✅ 发送/接收全局通知
✅ 支持自定义页面切换动画
✅ 支持完整的生命周期监听
❌ 单元测试
✅ 完整的文档(7/10)

使用g_faraday的APP #



序号
名称
版本号
iOS
Android




0
寓小二
8.0.0
AppStore
应用宝




您的app也在使用?联系我们

Show Cases #

Example App #
Android下载apk

设计原则 #

对原有平台最小侵入
对现有代码最小改动
API尽量保持和原有平台一致

更新策略 #
Flutter stable channel 发布后 一周内适配发布对应的g_faraday版本
Requirements #

Flutter 2.5.0 • channel stable
iOS 10.0+ Xcode 12.0+ Swift 5.1+
Android minSdkVersion 16 Kotlin 1.4.10+

版本对应关系 #



g_faraday
flutter
cocoapods
remark




^0.7.2
Flutter 2.5.0 • channel stable • https://github.com/flutter/flutter.git
any
recommend


^0.7.0
Flutter 2.0.0 • channel stable
any
not recommend


^0.5.1-nullsafety.0
Flutter 1.24.0-10.2.pre • channel beta
any
not recommend


^0.5.0-nullsafety.0
Flutter 1.24.0-10.2.pre • channel beta
any
not recommend


^4.0.0
Flutter 1.24.0-10.2.pre • channel beta
any
not recommend



快速开始 #
如果您已经有其他类似框架使用经验,可以直接查看Example浏览最佳实践。

run example project: flutter run --no-sound-null-safety

添加依赖 #
dependencies:
g_faraday: ^0.7.0
copied to clipboard
Flutter 端集成 #
flutter侧的集成工作,主要是注册需要从原生打开的页面。

// 0x00 定义 route
final route = faraday.wrapper((settings) {
switch (settings.name) {
case 'first_page':
return CupertinoPageRoute(builder: (context) => Text('First Page'));
case 'second_page':
return CupertinoPageRoute(builder: (context) => Text('Second Page'));
}
return CupertinoPageRoute(builder: (context) => Text(settings.name));
});

// 0x01 将 route 赋给你的app widget
CupertinoApp(onGenerateRoute: (_) => route);

// 0x02 flutter 侧集成完毕,接下来你可以选择 集成iOS/Android
copied to clipboard

注意不管是CupertinoApp还是MaterialApp都不要设置home

iOS 集成 #
Objective-C集成看这里
为了实现从Flutter端打开原生页面的应用场景,所以我们需要实现一个打开原生页面的protocol

// 0x00 实现 `FaradayNavigationDelegate`
extension AppDelegate: FaradayNavigationDelegate {

func push(_ name: String, arguments: Any?, options: [String : Any]?, callback token: CallbackToken) {

let isFlutter = options?["flutter"] as? Bool ?? false
let isPresent = options?["present"] as? Bool ?? false

let vc = isFlutter ? FaradayFlutterViewController(name, arguments: arguments) : FirstViewController(name, arguments: arguments)

let topMost = UIViewController.fa.topMost
if (isPresent) {
// 此处注意
// vc.modalPresentationStyle 不能是`pageSheet`
// 如果的确需要这种UI效果,可以配合透明背景,在Flutter侧实现
topMost?.present(vc, animated: true, completion: nil)
} else {
topMost?.navigationController?.pushViewController(vc, animated: true)
}

// 非常重要
// 如果此处不调用 `enableCallback` 那么flutter侧`await Navigator`则永远不会返回
vc.fa.enableCallback(with: token)
}
}

// 0x01 在 `application: didFinishLaunchingWithOptions`中启动flutter engine
Faraday.default.startFlutterEngine(navigatorDelegate: self)


// 0x02 打开一个flutter 页面
let vc = FaradayFlutterViewController("first_page", arguments: nil)
navigationController?.pushViewController(vc, animated: true)

// 0x03 集成完毕
copied to clipboard
Android 集成 #
为了实现从Flutter端打开原生页面的应用场景,所以我们需要实现一组打开原生页面的接口

// 0x00 实现 navigator
class SimpleFlutterNavigator : FaradayNavigator {

companion object {
const val KEY_ARGS = "_args"
}

override fun create(name: String, arguments: Serializable?, options: HashMap<String, *>?): Intent? {
val context = Faraday.getCurrentActivity() ?: return null

val isFlutterRoute = options?.get("flutter") == true

if (isFlutterRoute) {
// singleTask 模式
val builder = FaradayActivity.builder(name, arguments)

// 你看到的绿色的闪屏就是这个
builder.backgroundColor = Color.WHITE
builder.activityClass = SingleTaskFlutterActivity::class.java

return builder.build(context);
}

when (name) {
"flutter2native" -> {
return Intent(context, FlutterToNativeActivity::class.java)
}
"native2flutter" -> {
return Intent(context, Native2FlutterActivity::class.java)
}
"tabContainer" -> {
return Intent(context, TabContainerActivity::class.java)
}
else -> {
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(name)
intent.putExtra(KEY_ARGS, arguments)
return intent
}
}

}

override fun pop(result: Serializable?) {
val activity = Faraday.getCurrentActivity() ?: return
if (result != null) {
activity.setResult(Activity.RESULT_OK, Intent().apply { putExtra(KEY_ARGS, result) })
}
activity.finish()
}

override fun enableSwipeBack(enable: Boolean) {

}

}

// 0x01 在 Application 的onCreate方法中启动FlutterEngine
if (!Faraday.startFlutterEngine(this, SimpleFlutterNavigator())) {
GeneratedPluginRegistrant.registerWith(Faraday.engine)
}

// 0x02 打开一个Flutter页面
val intent = FaradayActivity.build(context, routeName, params)
context.startActivity(intent)

copied to clipboard
faraday 全家桶 (推荐) #
在进行Flutter混合开发时会遇到很多相似的问题,我们提供了相应的解决方案大家玩的开心。

路由
桥接原生方法
网络请求
JSON
命令行工具 | 代码生成
vscode 插件 | 自动补全
打包发布 | CI/CD

FAQ #
是否支持使用第三方路由框架? #
支持。
example中提供了fluro和getx的实现范例
是否支持使用url配置路由? #
支持。

ios推荐使用⛵️ URLNavigator
android原生支持
flutter推荐fluro

可以保证3端统一使用url进行路由管理。
打包时提示 failed to load module 'g_faraday' #
请使用xcode 12.3及以上版本
Communication #
扫码加入微信群,请备注 faraday

Contributing #
If you wish to contribute a change to any of the existing plugins in this repo, please review our contribution guide and open a pull request.
License #
g_faraday is released under the MIT license. See LICENSE for details.

License:

For personal and professional use. You cannot resell or redistribute these repositories in their original state.

Files In This Product:

Customer Reviews

There are no reviews.