alibaba / flutter_boost

FlutterBoost is a Flutter plugin which enables hybrid integration of Flutter for your existing native apps with minimum efforts
https://github.com/alibaba/flutter_boost
MIT License
6.98k stars 1.23k forks source link

iOS原生通过boost跳转到flutter页面后弹出showCupertinoModalPopup报错 #1520

Open VVennn opened 2 years ago

VVennn commented 2 years ago

[✓] Flutter (Channel stable, 2.5.3, on macOS 11.6.1 20G224 darwin-x64, locale zh-Hans-CN) [!] Android toolchain - develop for Android devices (Android SDK version 31.0.0) ✗ cmdline-tools component is missing Run path/to/sdkmanager --install "cmdline-tools;latest" See https://developer.android.com/studio/command-line for more details. ✗ Android license status unknown. Run flutter doctor --android-licenses to accept the SDK licenses. See https://flutter.dev/docs/get-started/install/macos#android-setup for more details. [✓] Xcode - develop for iOS and macOS [✓] Chrome - develop for the web [✓] Android Studio (version 2020.3) [✓] VS Code (version 1.63.1) [✓] Connected device (3 available)

! Doctor found issues in 1 category.

这是flutter版本,对应flutter_boost是1.17.1。 复现步骤是用boost open到一个flutter页面A,close后,再次打开页面A,点击出现弹框。我这里可以提供可复现的最小demo,如需可提供

如下是部分弹框代码: image 如下是报错信息: image

songyanghe666 commented 2 years ago

flutter framework不允许在initstate期间重新刷新试图,如果希望完成init后马上进行一些试图变更,建议使用future.delay(duration.zero,()=>xxx)把事件加入到异步队列,在initstate之后由虚拟机调度执行。

VVennn commented 2 years ago

flutter framework不允许在initstate期间重新刷新试图,如果希望完成init后马上进行一些试图变更,建议使用future.delay(duration.zero,()=>xxx)把事件加入到异步队列,在initstate之后由虚拟机调度执行。

这并非是马上进行视图变更,而是我点击触发的,与队列无关吧。并且即使我alert弹窗添加到异步队列中仍有此问题。 当我使用navigator2.0的delegate初始化route后,以route.navigator跳转并不会出现该问题,但是我boost并没有可以初始化的地方,请问我该如何处理这种情况?

songyanghe666 commented 2 years ago

flutter framework不允许在initstate期间重新刷新试图,如果希望完成init后马上进行一些试图变更,建议使用future.delay(duration.zero,()=>xxx)把事件加入到异步队列,在initstate之后由虚拟机调度执行。

这并非是马上进行视图变更,而是我点击触发的,与队列无关吧。并且即使我alert弹窗添加到异步队列中仍有此问题。� 当我使用navigator2.0的delegate初始化route后,以route.navigator跳转并不会出现该问题,但是我boost并没有可以初始化的地方,请问我该如何处理这种情况?

可以麻烦展示详细的demo吗?

VVennn commented 2 years ago

flutter framework不允许在initstate期间重新刷新试图,如果希望完成init后马上进行一些试图变更,建议使用future.delay(duration.zero,()=>xxx)把事件加入到异步队列,在initstate之后由虚拟机调度执行。

这并非是马上进行视图变更,而是我点击触发的,与队列无关吧。并且即使我alert弹窗添加到异步队列中仍有此问题。� 当我使用navigator2.0的delegate初始化route后,以route.navigator跳转并不会出现该问题,但是我boost并没有可以初始化的地方,请问我该如何处理这种情况?

可以麻烦展示详细的demo吗?

麻烦留个邮箱可以吗?我这边demo提示无法上传

VVennn commented 2 years ago

flutter framework不允许在initstate期间重新刷新试图,如果希望完成init后马上进行一些试图变更,建议使用future.delay(duration.zero,()=>xxx)把事件加入到异步队列,在initstate之后由虚拟机调度执行。

这并非是马上进行视图变更,而是我点击触发的,与队列无关吧。并且即使我alert弹窗添加到异步队列中仍有此问题。� 当我使用navigator2.0的delegate初始化route后,以route.navigator跳转并不会出现该问题,但是我boost并没有可以初始化的地方,请问我该如何处理这种情况?

可以麻烦展示详细的demo吗?

我这边就是下载了官方的demo,然后通过本地集成的方式pod到demo项目中。对官网demo的更改仅在FirstRouteWidget的Column中添加了如下widget

            GestureDetector(
              child: Container(
                color: Colors.red,
                height: 100,
                width: 200,
              ),
              onTap: () {
                print('taptap');
                showAlert.showSheet(context);
              },
              onLongPress: () {
                print('longPress');
                showAlert.showSheet(context);
              },
            ),

showAlert 代码如下

class showAlert {
  static showSheet(BuildContext context) {
    return showCupertinoModalPopup(
      context: context,
      builder: (BuildContext context) {
        return CupertinoActionSheet(
          title: Text('提示'),
          message: Text('是否要删除当前项?'),
          actions: <Widget>[
            CupertinoActionSheetAction(
              isDefaultAction: true,
              child: Text('删除'),
              onPressed: () {
                Navigator.of(context, rootNavigator: true).pop();
              },
            ),
            CupertinoActionSheetAction(
              isDestructiveAction: true,
              child: Text('不删除'),
              onPressed: () {
                Navigator.of(context, rootNavigator: true).pop();
              },
            ),
          ],
        );
      },
    );
  }
}

复现步骤:就是原生用flutterboost跳转到first路由后,点击红色方框,关闭红色方框,返回到上个界面,再用flutterboost跳转到first路由后就能复现

flutter版本2.x均可,flutter_boost是官方下的1.17.1

VVennn commented 2 years ago

sorry之前没看到如何提issues,fork的可复现最小demo在下面链接了,麻烦2位了 @0xZOne @songyanghe666