flutter_boost icon indicating copy to clipboard operation
flutter_boost copied to clipboard

3.0最新版本FlutterBoost,每次push一个页面,都会重新build栈内所有页面,问题得不到解决

Open 528526221 opened this issue 3 years ago • 14 comments

Steps to Reproduce

路由表映射关系如下: static Map<String, FlutterBoostRouteFactory> routerMap = { FlutterRouteTable.A: (settings, uniqueId) { return CupertinoPageRoute( settings: settings, builder: (_) { final params = getParamsFromSettings(settings); return buildPage(APage( params: params, )); }); }, FlutterRouteTable.B: (settings, uniqueId) { return CupertinoPageRoute( settings: settings, builder: () { final params = _getParamsFromSettings(settings); return buildPage(BPage( params: params, )); }); }, }

先打开Flutter A 页面,再打开Flutter B页面。routerMap中也会执行A的builder函数,相当于重新构造了一次APage,这是正常的吗?

Flutter Boost Version v3.0-null-safety-preview.15 Target Platform: Target OS version/browser: Devices:

Logs

add your crash log or something else.

528526221 avatar Nov 05 '21 03:11 528526221

看上去不太正常,你这个能给我们一个可以复现的例子吗

ColdPaleLight avatar Nov 13 '21 12:11 ColdPaleLight

看上去不太正常,你这个能给我们一个可以复现的例子吗

感谢您的回复!使用的就是demo中的代码,稍加有所改动。 代码如下: ` void main() { ///添加全局生命周期监听类 PageVisibilityBinding.instance.addGlobalObserver(AppLifecycleObserver());

///这里的CustomFlutterBinding调用务必不可缺少,用于控制Boost状态的resume和pause CustomFlutterBinding(); runApp(MyApp()); }

///创建一个自定义的Binding,继承和with的关系如下,里面什么都不用写 class CustomFlutterBinding extends WidgetsFlutterBinding with BoostFlutterBinding {}

class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); }

class MyAppState extends State<MyApp> { static Map<String, FlutterBoostRouteFactory> routerMap = { '/': (settings, uniqueId) { return PageRouteBuilder( settings: settings, pageBuilder: (, __, __){ debugPrint("build page -> mainPage"); return MainPage(); }); }, 'simplePage': (settings, uniqueId) { return PageRouteBuilder( settings: settings, pageBuilder: (, __, __){ debugPrint("build page -> simplePage"); return SimplePage(); }); }, 'replacementPage' : (settings, uniqueId) { return PageRouteBuilder( settings: settings, pageBuilder: (, __, ___){ debugPrint("build page -> replacementPage"); return ReplacementPage(); }); }

};

Route routeFactory(RouteSettings settings, String uniqueId) { FlutterBoostRouteFactory func = routerMap[settings.name]; if (func == null) { return null; } return func(settings, uniqueId); }

Widget appBuilder(Widget home) { return MaterialApp( home: home, debugShowCheckedModeBanner: true, ///必须加上builder参数,否则showDialog等会出问题 builder: (_, __) { return home; }, initialRoute: "/", ); } @override Widget build(BuildContext context) { return FlutterBoostApp( routeFactory, appBuilder: appBuilder, ); } } `

页面操作步骤为 mainPage 中打开 simplePage , routerMap中日志显示如下: I/flutter (24797): build page -> simplePage I/flutter (24797): build page -> mainPage 然后在simplePage中打开 replacementPage, routerMap中日志显示如下 I/flutter (24797): build page -> replacementPage I/flutter (24797): build page -> mainPage I/flutter (24797): build page -> simplePage

不明白哪里出了问题,希望得到答复!

附Flutter Doctor日志: [✓] Flutter (Channel unknown, 2.0.3, on macOS 11.2.3 20D91 darwin-x64, locale zh-Hans-CN) • Flutter version 2.0.3 at /Users/xulc/Library/flutter • Framework revision 4d7946a68d (8 个月前), 2021-03-18 17:24:33 -0700 • Engine revision 3459eb2436 • Dart version 2.12.2

[✓] Android toolchain - develop for Android devices (Android SDK version 31.0.0) • Android SDK at /Users/xulc/Library/Android/sdk • Platform android-31, build-tools 31.0.0 • ANDROID_HOME = /Users/xulc/Library/Android/sdk • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 11.0.8+10-b944.6916264) • All Android licenses accepted.

[!] Xcode - develop for iOS and macOS • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 12.2, Build version 12B45b ✗ CocoaPods not installed. CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side. Without CocoaPods, plugins will not work on iOS or macOS. For more info, see https://flutter.dev/platform-plugins To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.

[✓] Chrome - develop for the web • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 4.2) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: 🔨 https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 11.0.8+10-b944.6916264)

[✓] Connected device (2 available) • SM G9730 (mobile) • R28M800NJ2X • android-arm64 • Android 11 (API 30) • Chrome (web) • chrome • web-javascript • Google Chrome 95.0.4638.69

528526221 avatar Nov 15 '21 11:11 528526221

我也遇到,在线急等解决

liuyicheng3 avatar Nov 24 '21 03:11 liuyicheng3

重现代码 git clone [email protected]:liuyicheng3/flutter_boost.git git checkout dev-v3.0-null-safety-preview.16-bug-replay

路径 ( open flutter page => popUntil demo  => 点下面两个按钮进去然后回来 每次 都rebuild)

liuyicheng3 avatar Nov 25 '21 02:11 liuyicheng3

试了用原生的 Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) { return TransparentWidget(); }));

不会导致rebuild

liuyicheng3 avatar Nov 25 '21 03:11 liuyicheng3

试了用原生的 Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) { return TransparentWidget(); }));

不会导致rebuild

由于boost 内部采用 navigator 2.0 管理内部路由,而 navigator 2.0 flutter本来就有 rebuild问题,所以不是boost导致的,可以参考给官方提的isuess:https://github.com/flutter/flutter/issues/91657#event-5668851667。你现在使用原生的肯定是没问题的,它走的是 navigator 1.0 逻辑

xujinping avatar Nov 25 '21 03:11 xujinping

相关提交:#flutter/pull/71689

0xZOne avatar Nov 25 '21 09:11 0xZOne

目前可行的解决方案https://github.com/alibaba/flutter_boost/pull/1486

xujinping avatar Nov 26 '21 14:11 xujinping

目前可行的解决方案#1486

感谢您的回复,但我试了下 貌似效果是一样的:)

528526221 avatar Nov 30 '21 10:11 528526221

目前可行的解决方案#1486

感谢您的回复,但我试了下 貌似效果是一样的:)

代码发出来看看

xujinping avatar Nov 30 '21 11:11 xujinping

1486 那个问题解决了 栈内所有widget build函数,目前问题是,如果使用了 PageVisibilityBinding 则会导致上一个 页面的build函数,push时, 如果关闭 PageVisibilityBinding 这个,则不会再build

hatjs880328s avatar Feb 19 '22 04:02 hatjs880328s

1486 那个问题解决了 栈内所有widget build函数,目前问题是,如果使用了 PageVisibilityBinding 则会导致上一个 页面的build函数,push时, 如果关闭 PageVisibilityBinding 这个,则不会再build

请问怎么解决的啊,我现在也是用PageRouteBuilder的方式打开弹窗,结果底下的页面会刷新。

BelindaShy avatar Mar 25 '22 06:03 BelindaShy

试了用罂粟的 Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) { return TransparentWidget(); })); 不会导致重建

boost 内部采用 navigator 2.0 管理路径,而 navigator 2.0 flutter 本来就有问题,所以不是参考boost内部的,可以给官方的提问题:https ://github.com/flutter/flutter/issues/91657# event-5668851667。你现在使用的肯定是没有问题的,它走的是navigator 1.0逻辑

试了用罂粟的 Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext) { return TransparentWidget(); })); 不会导致重建

boost 采用 navigator 2.0 管理路径,而 navigator 2.0 flutter 本来的问题,所以不是参考boost有内部的问题,可以给官方的问题:https: //github.com/flutter/flutter/issues/91657#event-588851667 。你现在使用的肯定是没有问题的,它走的是navigator 1.0逻辑

您这个说法我验证过,并不是官方的navigator 2.0有问题,而是您这个样例本身代码有误。

zhukai-cn avatar Mar 30 '22 04:03 zhukai-cn

试了用原生的 Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) { return TransparentWidget(); })); 不会导致rebuild

由于boost 内部采用 navigator 2.0 管理内部路由,而 navigator 2.0 flutter本来就有 rebuild问题,所以不是boost导致的,可以参考给官方提的isuess:https://github.com/flutter/flutter/issues/91657#event-5668851667。你现在使用原生的肯定是没问题的,它走的是 navigator 1.0 逻辑

Hello. How do you fix this issue? https://github.com/flutter/flutter/issues/91657 I implement navigation 2.0 and when I push, all pages is rebuild.

devnta avatar Nov 28 '23 04:11 devnta