-
-
Notifications
You must be signed in to change notification settings - Fork 68
Description
Version
1.26.2
Platforms
dart
Device Model
iPhone 17
flutter info
[✓] Flutter (Channel stable, 3.38.5, on macOS 26.1 25B78 darwin-arm64, locale zh-Hans-CN) [536ms]
• Flutter version 3.38.5 on channel stable at /Users/caocong/fvm/versions/stable
• Upstream repository https://github.com/flutter/flutter.git
• Framework revision f6ff1529fd (3 weeks ago), 2025-12-11 11:50:07 -0500
• Engine revision 1527ae0ec5
• Dart version 3.10.4
• DevTools version 2.51.1
• Feature flags: enable-web, enable-linux-desktop, enable-macos-desktop, enable-windows-desktop, enable-android, enable-ios, cli-animations,
enable-native-assets, omit-legacy-version-file, enable-lldb-debugging
[✓] Android toolchain - develop for Android devices (Android SDK version 36.1.0-rc1) [4.7s]
• Android SDK at /Users/caocong/Library/Android/sdk
• Emulator version 36.2.12.0 (build_id 14214601) (CL:N/A)
• Platform android-36, build-tools 36.1.0-rc1
• ANDROID_HOME = /Users/caocong/Library/Android/sdk
• ANDROID_SDK_ROOT = /Users/caocong/Library/Android/sdk
• Java binary at: /Users/caocong/Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java
This is the JDK bundled with the latest Android Studio installation on this machine.
To manually set the JDK path, use: `flutter config --jdk-dir="path/to/jdk"`.
• Java version OpenJDK Runtime Environment (build 21.0.7+-13880790-b1038.58)
• All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 26.2) [2.1s]
• Xcode at /Applications/Xcode.app/Contents/Developer
• Build 17C52
• CocoaPods version 1.16.2
[✓] Chrome - develop for the web [7ms]
• Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
[✓] Connected device (6 available) [6.5s]
• Caocong的iPhone (mobile) • 00008020-00065C313CF8002E • ios • iOS 18.5 22F76
• iPhone xs max (wireless) (mobile) • 00008020-0005305634D8003A • ios • iOS 15.3.1 19D52
• iPhone 17 Pro Max (mobile) • 9B81FBE2-1572-416B-8429-FEE93753E0A3 • ios • com.apple.CoreSimulator.SimRuntime.iOS-26-0 (simulator)
• iPhone Air (mobile) • FBBEAAEC-BAB4-4143-8574-0ACA4DE86346 • ios • com.apple.CoreSimulator.SimRuntime.iOS-26-2 (simulator)
• macOS (desktop) • macos • darwin-arm64 • macOS 26.1 25B78 darwin-arm64
• Chrome (web) • chrome • web-javascript • Google Chrome 143.0.7499.170
[✓] Network resources [4.2s]
• All expected network resources are available.
• No issues found!How to reproduce?
问题描述
在 observer_widget.dart 第 553 行存在一个拼写错误,导致在切换 Tab 时组件被 dispose 后触发断言失败。
错误信息
flutter: [ErrorLogger] 'package:scrollview_observer/src/common/observer_widget.dart': Failed assertion: line 559 pos 12: '_scopeContext.mounted': is not true.
flutter: #2 ObserverWidgetState._checkTagChange (package:scrollview_observer/src/common/observer_widget.dart:559:12)
flutter:
问题原因
在 lib/src/common/observer_widget.dart 第 553 行:
| if (tag == oldWidget) return; |
void _checkTagChange(T oldWidget) async {
final oldTag = oldWidget.tag ?? '';
final tag = widget.tag ?? '';
if (tag == oldWidget) return; // ❌ 错误:比较 String 和 Widget,永远不会相等
// ...
}
问题:tag == oldWidget 比较的是 String 和 Widget 对象,永远不会为 true。 应该是:tag == oldTag(比较两个 String)
影响
由于这个条件永远不成立,方法会继续执行:
await WidgetsBinding.instance.endOfFrame; 等待当前帧结束
如果在等待期间组件被 dispose(例如切换 Tab),context 变为 unmounted
第 559 行 assert(_scopeContext.mounted) 断言失败
建议修复
- if (tag == oldWidget) return;
- if (tag == oldTag) return;
Logs
Example code (optional)
Contact
No response