Coder Social home page Coder Social logo

foxsofter / flutter_thrio Goto Github PK

View Code? Open in Web Editor NEW
747.0 21.0 77.0 17.66 MB

flutter_thrio makes it easy and fast to add flutter to existing mobile applications, and provide a simple and consistent navigator APIs.

License: MIT License

Ruby 0.02% Dart 99.98%
flutter objective-c ios android kotlin hybird hybrid-app cross-platform flutter-apps flutter-examples

flutter_thrio's Introduction

thrio logo

pub package license

中文文档 英文文档 问题集 原仓库不再维护,代码已经很老了

最近版本更新会很快,主要是增加新特性,涉及到混合栈的稳定性的问题应该不多,可放心升级,发现问题加 QQ 群号码:1014085473,我会尽快解决。

不打算好好看看源码的使用者可以放弃这个库了,因为很多设定是比较死的,而我本人不打算花时间写太多文档

优势

  1. 稳定性、通用性在部分项目中得到验证,有用户反馈,将整个 app 的路由方案全部切换到后,崩溃率降低显著
  2. 内存占用方面,thrio 在连续打开 Flutter 页面的内存占用方面从一开始就碾压主流的 Flutter 混合栈,更进一步的,避开原理层面带来的内存优势,这里有个对比,也说明 thrio 在内存占用上的优异表现,传送门
  3. 支持 FlutterEngine 的复用,还支持 FlutterViewControllerFlutterActivity 的复用,这保证了 Flutter 混合栈框架在内存占用上是最优解
  4. 在 3 情形下,支持 跨栈路由 的能力,这是目前唯一能做到的 Flutter混合栈开源框架
  5. 在 3 情形下,除了提供 pushpop,也提供了 removepopTo 的能力,目前唯一能做到的 Flutter混合栈开源框架
  6. 在 3 情形下,提供页面通知的能力,组合 pushpop 的路由传参能力,可以让状态参数在页面间传递,省去很多 channel 通讯的必要
  7. 在 3 情形下,页面传参支持Json对象类型,单引擎下纯 Flutter 开发支持直接传递对象类型
  8. 在 3 情形下,支持完整的页面生命周期
  9. 在 3 情形下,支持完整的路由周期,兼容使用 FlutterNavigator 来打开对话框等弹窗
  10. 在 3 情形下,支持多引擎模式,可以在一个原生 App 中运行多份 Flutter 代码,目前唯一能做到的 Flutter 混合栈开源框架
  11. 在 3 情形下,解决 iOS 和 Android 上的侧滑返回手势冲突
  12. iOS 上自动隐藏 Flutter 页面的导航栏
  13. 额外的支持三端统一的模块化方式,更好的与路由API配合

劣势

  1. 在 iOS 上不支持 present,技术上完全可以实现,甚至使用者可以通过传参的方式在 builder 中自己 present,但为了 API 设计上统一,作者选择不支持 present,demo 中其实是有 present 的示例的,建议 present 的时候外套一个 UINavigationController,可以保证不管何时 push 时 API 都是有效的,flutter_thrio 是支持多 UINavigationController 的,有一点需要注意的是,如果多个 UINavigationController 内嵌于 UITabBar 中时,要注意无法同时将多个 FlutterViewController 呈现,不支持是因为支持的话无法进行引擎复用。
  2. 在 Android 上不支持 Fragment,原因是复杂性无法解决,作者目前不能够保证提供一个通用稳定的版本。

入门

  1. clone thrio 的源码,查看 demo,并运行起来
  2. 通过 pub 引入 thrio,建议采用 1.0.0 之后的版本,之前的版本支持1.22.x之前的Flutter SDK,但不建议继续采用这些老版本的 SDK,还是尽快升级到新版
  3. 模仿 thrio demo 中的源码,在现有工程上加入相关代码
  4. 不要继承 Flutter SDK 中的一些类,比如 FlutterViewControllerFlutterActivityFlutterAppDelegate
  5. 不要调用 GeneratedPluginRegistrantregisterWithRegistry 方法了,因为框架会自动调用
  6. url 至少保持两段

最后

  1. 技术没有好与不好,使用在适合的场景才是最好的。

  2. Flutter 在 客户端的适用场景会越来越广,个人比较看好。

  3. 目前在移动端,一个好的 Flutter 混合栈框架是必须的,让你可以在大多数的页面上采用 Flutter 来开发从而达到提效的目的,少数涉及到 Flutter 不能很好支持的页面上继续使用原生开发,从而规避的 Flutter 的坑。

  4. 如果所开发的是一个全新的 App,以后也不会涉及到老的代码的复用,或者不会涉及到 Flutter 支持不够良好的一些技术上的坑,确实可以考虑纯 Flutter。

  5. 但4的情形极少,所以大部分的 Flutter 在引入的时候,都应该考虑以 Flutter 混合栈的方式进行,坑不是用来踩的,而是绕道而过。

flutter_thrio's People

Contributors

androidyue avatar angdo avatar cornerant avatar docee avatar foxsofter avatar hxiaoming avatar kmfish avatar liujinlong123 avatar prczhb avatar vadaski avatar xwnine avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

flutter_thrio's Issues

Android 端 返回键的问题(iOS的效果不知道)

image

官方的flutteractivity里, 按返回键(手机的物理按键) 它会先弹出flutter 的堆栈里的页面(触发 dart: Navigator.of(context).pop();) ,当无页面可弹时 他才会关闭当前activity (触发 dart: SystemNavigator.pop();)
例如: 入栈:A(原生) -> B1(flutter) -> B2(flutter) -> B3(flutter) (B1 到 B2 B3 是通过 Navigator.of(context).push()来跳转的 而非其他方式)
按返回键 B3(flutter) -> B2(flutter) -> B1(flutter) -> A(原生)

而 thrio ,按返回键时(手机的物理按键) ,他不会弹出flutter 的堆栈里的页面 而是直接关闭当前activity .
例如: 入栈:A(原生) -> B1(flutter) -> B2(flutter) -> B3(flutter) (B1 到 B2 B3 是通过 Navigator.of(context).push()来跳转的, 而非 Thrio 的方式)
按返回键 B3(flutter) -> A(原生) (直接关闭了整个flutter)

请问这种情况该咋处理? 我需要通过 Thrio 的页面打开方式 ,而不能用flutter的 Navigator.of(context)方式?

1.20.x 报 Unsupported operation: Cannot add to an unmodifiable list

#0      UnmodifiableListMixin.add (dart:_internal/list.dart:114)
#1      ThrioNavigatorImplement.builder.<anonymous closure> (package:thrio/src/navigator/thrio_navigator_implement.dart:81)
#2      _MaterialAppState.build.<anonymous closure>.<anonymous closure> (package:flutter/src/material/app.dart:653)
#3      Builder.build (package:flutter/src/widgets/basic.dart:7118)
#4      StatelessElement.build (package:flutter/src/widgets/framework.dart:4620)
#5      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4546)
#6      Element.rebuild (package:flutter/src/widgets/framework.dart:4262)
#7      ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4525)
#8      ComponentElement.mount (package:flutter/src/widgets/framework.dart:4520)
#9      Element.inflateWidget (package:flutter/src/widgets/framework.dart:3490)

pod install 失败

[!] Invalid `Podfile` file: Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first.

 #  from /Users/haocold/Desktop/flutter_thrio-0.4.3/example/ios/Podfile:48
 #  -------------------------------------------
 #      unless File.exist?(generated_xcode_build_settings_path)
 >        raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
 #      end
 #  -------------------------------------------

Dart页面在iOS上的侧滑返回在自定义转场动画时失效

[✓] Flutter (Channel stable, v1.17.1, on Mac OS X 10.15.5 19F96, locale zh-Hans-CN)

[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 11.5)
[✓] Android Studio (version 3.6)
[✓] VS Code (version 1.45.1)
[✓] Connected device (2 available)

0.4.3 Android代码 RouteSettings中的fromArguments方法返回了可空类型的RouteSettings? 导致编译异常

版本

0.4.3

问题描述

RouteSettings 中的 fromArguments方法的返回值返回了可空类型的RouteSettings?,导致NavigationController 中doPush方法中的 settings.isNested = PageRoutes.hasRoute(pageId)和val route = PageRoute(settings, activity::class.java)编译异常

RouteSettings

fun fromArguments(arguments: Map<String, Any>): RouteSettings? {
            if (arguments == null || !arguments.containsKey("url")) {
                return null
            }
            val url = arguments["url"] as String
            val index = if (arguments["index"] != null) arguments["index"] as Int else 0
            val params = arguments["params"]
            val animated = if (arguments["animated"] != null) arguments["animated"] as Boolean else false
            return RouteSettings(url, index).also {
                it.params = params
                it.animated = animated
            }
        }

NavigationController

 fun doPush(activity: Activity) {
            if (routeAction != RouteAction.PUSH) {
                result = null
                poppedResult = null
                return
            }
            routeAction = RouteAction.PUSHING

            checkNotNull(result) { "result must not be null" }
            val settingsData = activity.intent.getSerializableExtra(NAVIGATION_ROUTE_SETTINGS_KEY).let {
                checkNotNull(it) { "push params not found" }
                it as Map<String, Any>
            }

            val settings = RouteSettings.fromArguments(settingsData) // 返回值为可空类型
         
           // 直接使用可空类型导致编译失败
            settings.isNested = PageRoutes.hasRoute(pageId) 
            val route = PageRoute(settings, activity::class.java)
        
    }

能否在IntentBuilder中的build方法里加上params: Any? 的参数???

现状:

目前是混合开发,Flutter会跳转至现有native页面,但是现有native页面已有相关参数跳转方式,如果要再通过NAVIGATION_ROUTE_SETTINGS 获取参数成本太高,相当于一个activity有两套参数获取方式。

建议:

如果在IntentBuilder 的build方法中加入params字段即可解决问题,代码如下:

object FlutterModule : ThrioModule(), ModuleIntentBuilder {
    override fun onIntentBuilderRegister(context: Context) {
        registerIntentBuilder("native1", object : IntentBuilder {
            override fun getActivityClz(): Class<out Activity> {
                return SecondActivity::class.java
            }

            override fun build(context: Context, entrypoint: String, params: Any?): Intent {
                params as HashMap<String, Any>
                return Intent(context, SecondActivity::class.java).apply {
                    putExtras(Bundle().apply {
                        putString("nativeKey", params["key"].toString())
                    })
                }
            }
        })
    }
}

Android ThrioFlutterView.resetWillNotDraw 异常报错

具体堆栈如下:

io.flutter.embedding.android.ThrioFlutterView.resetWillNotDraw (ThrioFlutterView.kt:4)
io.flutter.embedding.android.ThrioFlutterView.access$resetWillNotDraw (ThrioFlutterView.kt:1)
io.flutter.embedding.android.ThrioFlutterView$onAccessibilityChangeListener$1.onAccessibilityChanged (ThrioFlutterView.kt:1)
io.flutter.view.AccessibilityBridge$2.onAccessibilityStateChanged (AccessibilityBridge.java:8)
android.view.accessibility.AccessibilityManager.lambda$notifyAccessibilityStateChanged$0 (AccessibilityManager.java:1305)
android.view.accessibility.-$$Lambda$AccessibilityManager$yzw5NYY7_MfAQ9gLy3mVllchaXo.run (未知来源:4)
android.os.Handler.handleCallback (Handler.java:883)
android.os.Handler.dispatchMessage (Handler.java:100)
android.os.Looper.loop (Looper.java:230)
android.app.ActivityThread.main (ActivityThread.java:7742)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:508)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1034)

源码如下:

private fun resetWillNotDraw(isAccessibilityEnabled: Boolean, isTouchExplorationEnabled: Boolean) {
        if (!attachedFlutterEngine!!.renderer.isSoftwareRenderingEnabled) {
            setWillNotDraw(!(isAccessibilityEnabled || isTouchExplorationEnabled))
        } else {
            setWillNotDraw(false)
        }
    }

是否因为使用!符是的应用异常报错

popTo可否支持数据传递params

  1. FlutterViewController中从栈底至栈顶依次为页面A -> 页面B -> 页面C。
  2. 现在使用popTo 至页面A。
  3. 如何从页面C,通过popTo携带参数至页面A

使用 image_picker,报错 (PlatformException(multiple_request, Cancelled by a second request, null))

用户多次触发channel调用,导致self.result 设置成nil。然后用户cancel时调用imagePickerControllerDidCancel时 调用self.result未做保护导致crash

- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
  if (self.result) {
    self.result([FlutterError errorWithCode:@"multiple_request"
                                    message:@"Cancelled by a second request"
                                    details:nil]);
    self.result = nil;
  }
  //略...
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
  [_imagePickerController dismissViewControllerAnimated:YES completion:nil];
  self.result(nil);

  self.result = nil;
  _arguments = nil;
}

我是新手,请问这个怎么处理

[Android] 在native pop到flutter的时候,activity可能丢失

  • Thrio v.0.2.1
  • Flutter v1.17.2 stable channel
  • Android

问题描述:

在flutter和native进行push和pop的过程中,flutter所在的activity可能丢失

复现方式:

flutter_thrio的example demo,做如下修改:

  1. lib/src/sample/module1/page1.dart

加入一个输入框, 放在页面中

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:thrio/thrio.dart';

class Page1 extends StatefulWidget {
  const Page1({
    Key key,
    this.index,
    this.params,
  }) : super(key: key);

  final int index;

  final dynamic params;

  @override
  _Page1State createState() => _Page1State();
}

class _Page1State extends State<Page1> {
  TextEditingController _inputController;
  @override
  void initState() {
    _inputController = TextEditingController();
    super.initState();

    if (mounted) {}
  }

  @override
  void dispose() {
    _inputController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) => NavigatorPageNotify(
      name: 'page1Notify',
      initialParams:
          widget.params == null ? null : widget.params['page1Notify'],
      onPageNotify: (params) =>
          ThrioLogger.v('flutter1 receive notify:$params'),
      child: Scaffold(
          appBar: AppBar(
            brightness: Brightness.light,
            backgroundColor: Colors.blue,
            title: const Text('thrio_example',
                style: TextStyle(color: Colors.black)),
            leading: const IconButton(
              color: Colors.black,
              tooltip: 'back',
              icon: Icon(Icons.arrow_back_ios),
              onPressed: ThrioNavigator.pop,
            ),
          ),
          body: SingleChildScrollView(
            child: Container(
              margin: const EdgeInsets.all(24),
              child: Column(
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    Container(
                      margin: const EdgeInsets.only(top: 10, bottom: 20),
                      alignment: AlignmentDirectional.center,
                      child: Text(
                        'flutter1: index is ${widget.index}',
                        style: TextStyle(fontSize: 28, color: Colors.blue),
                      ),
                    ),
                    Container(
                        height: 25,
                        width: 100,
                        child: TextField(
                            maxLines: 1,
                            controller: _inputController,
                            autofocus: true,
                            textInputAction: TextInputAction.search,
                            // onSubmitted: onSubmitted,
                            decoration: InputDecoration(
                              hintText: 'hintText',
                              contentPadding: const EdgeInsets.only(bottom: 12),
                              border: InputBorder.none,
                            ),
                            onChanged: print)),
                    InkWell(
                      onTap: () => ThrioNavigator.push(
                        url: '/biz1/flutter1',
                        params: {
                          '1': {'2': '3'}
                        },
                        poppedResult: (params) =>
                            ThrioLogger.v('/biz1/flutter1 popped:$params'),
                      ),
                      child: Container(
                          padding: const EdgeInsets.all(8),
                          margin: const EdgeInsets.all(8),
                          color: Colors.yellow,
                          child: const Text(
                            'push flutter1',
                            style: TextStyle(fontSize: 22, color: Colors.black),
                          )),
                    ),
                    InkWell(
                      onTap: () => ThrioNavigator.remove(url: '/biz1/flutter1'),
                      child: Container(
                          padding: const EdgeInsets.all(8),
                          margin: const EdgeInsets.all(8),
                          color: Colors.yellow,
                          child: const Text(
                            'remove flutter1',
                            style: TextStyle(fontSize: 22, color: Colors.black),
                          )),
                    ),
                    InkWell(
                      onTap: () => ThrioNavigator.push(
                        url: '/biz2/flutter2',
                        params: {
                          '1': {'2': '3'}
                        },
                        poppedResult: (params) => ThrioLogger.v(
                            '/biz1/flutter1 poppedResult call popped:$params'),
                      ),
                      child: Container(
                          padding: const EdgeInsets.all(8),
                          margin: const EdgeInsets.all(8),
                          color: Colors.yellow,
                          child: const Text(
                            'push flutter2',
                            style: TextStyle(fontSize: 22, color: Colors.black),
                          )),
                    ),
                    InkWell(
                      onTap: () =>
                          ThrioNavigator.pop(params: 'popped flutter1'),
                      child: Container(
                          padding: const EdgeInsets.all(8),
                          margin: const EdgeInsets.all(8),
                          color: Colors.yellow,
                          child: const Text(
                            'pop',
                            style: TextStyle(fontSize: 22, color: Colors.black),
                          )),
                    ),
                    InkWell(
                      onTap: () => ThrioNavigator.push(
                        url: 'native1',
                        params: {
                          '1': {'2': '3'}
                        },
                        poppedResult: (params) => ThrioLogger.v(
                            '/biz1/flutter1 poppedResult call params:$params'),
                      ),
                      child: Container(
                          padding: const EdgeInsets.all(8),
                          margin: const EdgeInsets.all(8),
                          color: Colors.grey,
                          child: const Text(
                            'push native1',
                            style: TextStyle(fontSize: 22, color: Colors.black),
                          )),
                    ),
                    InkWell(
                      onTap: () => ThrioNavigator.notify(
                        url: 'native1',
                        name: 'aaa',
                        params: {
                          '1': {'2': '3'}
                        },
                      ),
                      child: Container(
                          padding: const EdgeInsets.all(8),
                          margin: const EdgeInsets.all(8),
                          color: Colors.grey,
                          child: const Text(
                            'notify native1',
                            style: TextStyle(fontSize: 22, color: Colors.black),
                          )),
                    ),
                    InkWell(
                      onTap: () => ThrioNavigator.remove(url: 'native1'),
                      child: Container(
                          padding: const EdgeInsets.all(8),
                          margin: const EdgeInsets.all(8),
                          color: Colors.grey,
                          child: const Text(
                            'remove native1',
                            style: TextStyle(fontSize: 22, color: Colors.black),
                          )),
                    ),
                  ]),
            ),
          )));
}

  1. 运行demo,按照如下顺序push
    native1->flutter1->native1->flutter1
    可见每次flutter1都是会打开键盘,准备输入的

3.然后按照顺序pop回来
flutter1->native1-> flutter1
当页面回到flutter1的时候,键盘不打开了,无论加入SystemChannels.textInput.invokeMethod('TextInput.show'); 都是不可行

  1. 猜测在此时embedded flutterActivity已经被干掉,并且每次做pop操作的时候都会报错

报错信息:
E/FlutterEnginePluginRegistry( 7345): Attempted to notify ActivityAware plugins of onNewIntent, but no Activity was attached.
E/FlutterEnginePluginRegistry( 7345): Attempted to detach plugins from an Activity when no Activity was attached.

此问题影响在此flutterActivity上的一系列插件,都变得不可用

No implementation found for method push on channel _method___thrio_app__

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method push on channel method___thrio_app_)
E/flutter ( 8687): #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:154:7)
E/flutter ( 8687):
E/flutter ( 8687): #1 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:329:12)
E/flutter ( 8687): #2 ThrioChannel.invokeMethod (package:thrio/src/channel/thrio_channel.dart:63:27)
E/flutter ( 8687): #3 NavigatorRouteSendChannel.push (package:thrio/src/navigator/navigator_route_send_channel.dart:41:21)
E/flutter ( 8687): #4 ThrioNavigatorImplement.push (package:thrio/src/navigator/thrio_navigator_implement.dart:123:10)
E/flutter ( 8687): #5 ThrioNavigator.push (package:thrio/src/navigator/thrio_navigator.dart:42:31)
E/flutter ( 8687): #6 MyPage._settingList. (package:time_bourse/page/my/my_page.dart:305:41)
E/flutter ( 8687): #7 _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:779:19)
E/flutter ( 8687): #8 _InkResponseState.build. (package:flutter/src/material/ink_well.dart:862:36)
E/flutter ( 8687): #9 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:182:24)
E/flutter ( 8687): #10 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:504:11)
E/flutter ( 8687): #11 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:282:5)
E/flutter ( 8687): #12 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:254:7)
E/flutter ( 8687): #13 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:156:27)
E/flutter ( 8687): #14 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:222:20)
E/flutter ( 8687): #15 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:198:22)
E/flutter ( 8687): #16 GestureBinding._handlePointerEvent (package:flutter/src/gestures/binding.dart:156:7)
E/flutter ( 8687): #17 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:102:7)
E/flutter ( 8687): #18 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:86:7)
E/flutter ( 8687): #19 _rootRunUnary (dart:async/zone.dart:1196:13)
E/flutter ( 8687): #20 _CustomZone.runUnary (dart:async/zone.dart:1085:19)
E/flutter ( 8687): #21 _CustomZone.runUnaryGuarded (dart:async/zone.dart:987:7)
E/flutter ( 8687): #22 _invoke1 (dart:ui/hooks.dart:275:10)
E/flutter ( 8687): #23 _dispatchPointerDataPacket (dart:ui/hooks.dart:184:5)

请问下flutter作为第一屏 flutter—>native1 报这个错是什么原因

第二次从native页面打开flutter页面黑屏

第一次native打开flutter正常,再执行pop返回native页面,再次从native打开同一个flutter页面,黑屏
日志如下:
2020-05-28 16:37:43.638 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method registerUrls
2020-05-28 16:37:43.993 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method ready
2020-05-28 16:37:57.276 22675-22675/com.fumikeji.dangkou D/ActivityStackManager: ThrioActivity:attach
2020-05-28 16:37:57.307 22675-22675/com.fumikeji.dangkou E/Thrio: stack push url /biz1/flutter1 index 1
2020-05-28 16:37:57.311 22675-22675/com.fumikeji.dangkou D/WindowManager: Add to mViews: DecorView@34f09f5[ThrioActivity], this = android.view.WindowManagerGlobal@74d5636,pkg= com.fumikeji.dangkou
2020-05-28 16:37:57.342 22675-22675/com.fumikeji.dangkou I/SurfaceView: 103682954 mSurfaceControl 38702587 mBackgroundControl 97984024 creating: SurfaceView - com.fumikeji.dangkou/io.flutter.embedding.android.ThrioActivity
2020-05-28 16:37:57.351 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method onCreate notImplemented
2020-05-28 16:37:57.351 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method willAppear notImplemented
2020-05-28 16:37:57.357 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method didAppear notImplemented
2020-05-28 16:37:57.389 22675-22675/com.fumikeji.dangkou E/Thrio: push result data 1
2020-05-28 16:37:57.451 22675-22675/com.fumikeji.dangkou E/Thrio: onListen arguments null events io.flutter.plugin.common.EventChannel$IncomingStreamRequestHandler$EventSinkImplementation@3589e2
2020-05-28 16:37:59.058 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method pop
2020-05-28 16:37:59.070 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method willDisappear notImplemented
2020-05-28 16:37:59.081 22675-22675/com.fumikeji.dangkou E/Thrio: native1 popResult call params popped flutter1
2020-05-28 16:37:59.082 22675-22675/com.fumikeji.dangkou E/Thrio: stack pop url /biz1/flutter1 index 1
2020-05-28 16:37:59.140 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method didDisappear notImplemented
2020-05-28 16:38:01.704 22675-22675/com.fumikeji.dangkou D/ActivityStackManager: ThrioActivity:attach
2020-05-28 16:38:01.717 22675-22675/com.fumikeji.dangkou E/Thrio: stack push url /biz1/flutter1 index 1
2020-05-28 16:38:01.721 22675-22675/com.fumikeji.dangkou D/WindowManager: Add to mViews: DecorView@27d498a[ThrioActivity], this = android.view.WindowManagerGlobal@74d5636,pkg= com.fumikeji.dangkou
2020-05-28 16:38:01.729 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method onCreate notImplemented
2020-05-28 16:38:01.729 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method willAppear notImplemented
2020-05-28 16:38:01.729 22675-22675/com.fumikeji.dangkou E/Thrio: flutter call method didAppear notImplemented
2020-05-28 16:38:01.749 22675-22675/com.fumikeji.dangkou I/SurfaceView: 108825595 mSurfaceControl 80757784 mBackgroundControl 66879089 creating: SurfaceView - com.fumikeji.dangkou/io.flutter.embedding.android.ThrioActivity
2020-05-28 16:38:01.760 22675-22675/com.fumikeji.dangkou E/Thrio: push result data 1
2020-05-28 16:38:01.763 22675-22675/com.fumikeji.dangkou D/LeakCanary: Watching instance of io.flutter.embedding.android.ThrioActivity (io.flutter.embedding.android.ThrioActivity received Activity#onDestroy() callback) with key 7627e82f-0397-451c-8f86-4e29c01432fb
2020-05-28 16:38:01.763 22675-22675/com.fumikeji.dangkou D/ActivityStackManager: ThrioActivity:detach

[iOS] 如何自定义 NavigatorFlutterViewController ?

我通过继承 NavigatorFlutterViewController

NavigatorFlutterPageBuilder pageBuilder = ^NavigatorFlutterViewController* {
     return [[CustomFlutterViewController alloc] initWithEntrypoint:@""];
};
[self setFlutterPageBuilder: pageBuilder];

进入 Flutter 页面是白屏,请问正确的自定义方式是什么?

适配 1.17.x

主要问题是 Navigator 2.0 中 RouteSettings 去掉了 isInitialRoute 这个属性,thrio 目前复用了这个属性

内存泄露严重

我在Appdelegate中 执行[ThrioModule init:[RootThrioModule new]]; 代码之后,App一启动,内存就在不断增加。flutter版本是stable 1.75.5,希望给出解答

remove操作可能导致返回按钮不一致

场景:thrio允许remove最底部的页面A,这样会使该页面的上一个页面B变成最底部的页面
问题:如果B页面为原生,iOS中导航栏上返回按钮会自动消失,如果B页面为Flutter页面,返回按钮会继续出现。
此问题优先级并不高。

Flutter内通过ThrioNavigator push时参数不支持自定义对象

比如:

List<Friend> friends = .....
ThrioNavigator.push(url:"example1", params: friends.first)

会报 Friend 未定义异常,我查看了一下Thrio 的逻辑,大概是因为 Thrio 总是会去调用原生的部分,文档里有提到优先打开原生页面,原生打不开才会尝试打开Flutter页面,而这个flutter的自定义类在原生下肯定是 undefined 的

不知道这种情况是已知问题还是未曾发现.

Sent from PPHub

建议 Android 中自定义FlutterView等的代码切换成java的是否会更好

image

image

现在自定义的flutteractivity 是使用的kotlin编写的, 但他的源码FlutterActivity等是java编写的. 并且flutter又是频繁更新, 如果把自定义的flutter的编译语言切换回java, 在官方更新了FlutterActivity等相关代码时, 通过对比等能更方便去更新自定义的Activity等代码.

run example app failed, AndroidX

[!] Your app isn't using AndroidX.
To avoid potential build failures, you can quickly migrate your app by following the
steps on https://goo.gl/CP92wY.

FAILURE: Build failed with an exception.

  • What went wrong:
    Execution failed for task ':app:checkDebugDuplicateClasses'.

1 exception was raised by workers:
java.lang.RuntimeException: Duplicate class android.support.v4.app.INotificationSideChannel found in modules classes.jar (androidx.core:core:1.1.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub found in modules classes.jar (androidx.core:core:1.1.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub$Proxy found in modules classes.jar (androidx.core:core:1.1.0) and classes.jar (com.android.support:support-compat:28.0.0)
Duplicate class android.support.v4.graphics.drawable.IconCompatParcelizer found in modules classes.jar (androidx.core:core:1.1.0) and classes.jar (com.android.support:support-compat:28.0.0)

flutter端 url 带点的问题 "."

image

我自己的url里面带"." 正好thrio里关于url的解析也带"." 这就导致了url错误的问题.
建议调整一下获取原始url方法

请适配最新版本

在flutter 1.20.2 channel stable Dart 2.9.1版本下点击跳转到flutter无反应

大佬,这个是错误是怎么导致的,排查了快一天了。

2020-07-04 18:33:43.797706+0800 ios_app[30473:294343] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFBoolean compare:]: nil argument' *** First throw call stack: ( 0 CoreFoundation 0x00007fff23e3cf0e __exceptionPreprocess + 350 1 libobjc.A.dylib 0x00007fff50ba89b2 objc_exception_throw + 48 2 CoreFoundation 0x00007fff23ecfa51 _CFThrowFormattedException + 194 3 CoreFoundation 0x00007fff23ecfec9 -[__NSCFBoolean compare:].cold.1 + 41 4 CoreFoundation 0x00007fff23d7399b -[__NSCFBoolean compare:] + 475 5 CoreFoundation 0x00007fff23d731d6 -[__NSCFBoolean isEqualToNumber:] + 22 6 thrio 0x0000000110326da2 -[UINavigationController(Navigator) thrio_pushViewController:animated:] + 178 7 thrio 0x0000000110329b6c __117-[UINavigationController(Navigator) thrio_pushViewController:url:params:animated:fromEntrypoint:result:poppedResult:]_block_invoke + 172 8 thrio 0x000000011032b395 __102-[UIViewController(Navigator) thrio_pushUrl:index:params:animated:fromEntrypoint:result:poppedResult:]_block_invoke + 165 9 Flutter 0x000000010e14c357 _ZNSt3__110__function6__funcIN3fml8internal14CopyableLambdaIZN7flutter29PlatformMessageResponseDarwin8CompleteENS_10unique_ptrINS2_7MappingENS_14default_deleteIS8_EEEEE3$_0EENS_9allocatorISD_EEFvvEEclEv + 51 10 Flutter 0x000000010e161267 _ZN3fml15MessageLoopImpl10FlushTasksENS_9FlushTypeE + 117 11 Flutter 0x000000010e1661b4 _ZN3fml17MessageLoopDarwin11OnTimerFireEP16__CFRunLoopTimerPS0_ + 26 12 CoreFoundation 0x00007fff23da14b4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20 13 CoreFoundation 0x00007fff23da114e __CFRunLoopDoTimer + 1038 14 CoreFoundation 0x00007fff23da07aa __CFRunLoopDoTimers + 282 15 CoreFoundation 0x00007fff23d9b3fe __CFRunLoopRun + 1950 16 CoreFoundation 0x00007fff23d9a944 CFRunLoopRunSpecific + 404 17 GraphicsServices 0x00007fff38ba6c1a GSEventRunModal + 139 18 UIKitCore 0x00007fff48c8b9ec UIApplicationMain + 1605 19 ios_app 0x000000010deb4a62 main + 114 20 libdyld.dylib 0x00007fff51a231fd start + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.