小米HyperOS 2悬浮窗中Flutter应用加尺寸约束后白屏问题咨询
Flutter应用在HyperOS 2悬浮窗模式下添加尺寸约束后白屏问题
在搭载HyperOS 2的小米Redmi K80 Pro设备上运行Flutter应用时,出现持续性白屏问题:当给应用根组件添加尺寸约束(如使用带MediaQuery派生尺寸或固定值的SizedBox),应用在悬浮窗模式下会完全白屏;无约束时显示正常,全屏模式下也可正常运行。
代码示例
import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), home: const MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), body: Center( child: SizedBox( width: 100, height: 100, child: Center( child: Text( '$_counter', style: Theme.of(context).textTheme.headlineMedium, ), ), ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: const Icon(Icons.add), ), ); } }
观察到的行为
- 全屏模式下应用运行无异常;
- 悬浮窗模式下添加尺寸约束后UI完全空白;
- 日志中重复出现
VRI.reportNextDraw和Surface错误,提示窗口resize时存在渲染问题,日志片段如下:
E/BinderMonitor( 7845): err open binder_delay errno=13 W/ample.untitled6( 7845): type=1400 audit(0.0:248188): avc: denied { write } for name="binder_delay" dev="proc" ino=4026533067 scontext=u:r:untrusted_app:s0:c11,c258,c512,c768 tcontext=u:object_r:proc_mi_log:s0 tclass=file permissive=0 app=com.example.untitled6 D/VRI[MainActivity]( 7845): vri.reportNextDraw android.view.ViewRootImpl.handleResized:2768 android.view.ViewRootImpl.-$$Nest$mhandleResized:0 android.view.ViewRootImpl$W.resized:12716 android.app.servertransaction.WindowStateResizeItem.execute:64 android.app.servertransaction.WindowStateTransactionItem.execute:59 D/VRI[MainActivity]( 7845): vri.reportNextDraw android.view.ViewRootImpl.performTraversals:4936 android.view.ViewRootImpl.doTraversal:3547 android.view.ViewRootImpl$TraversalRunnable.run:11558 android.view.Choreographer$CallbackRecord.run:1747 android.view.Choreographer$CallbackRecord.run:1756 D/VRI[MainActivity]( 7845): vri.Setup new sync=wmsSync-VRI[MainActivity]#5 D/VRI[MainActivity]( 7845): vri.reportDrawFinished E/Surface ( 7845): freeAllBuffers: 1 buffers were freed while being dequeued! I/HandWritingStubImpl( 7845): refreshLastKeyboardType: 1 I/HandWritingStubImpl( 7845): getCurrentKeyboardType: 1 I/ample.untitled6( 7845): ProcessProfilingInfo new_methods=19 is saved saved_to_disk=1 resolve_classes_delay=8000 D/VRI[MainActivity]( 7845): vri.reportNextDraw android.view.ViewRootImpl.handleResized:2768 android.view.ViewRootImpl.-$$Nest$mhandleResized:0 android.view.ViewRootImpl$W.resized:12716 android.app.servertransaction.WindowStateResizeItem.execute:64 android.app.servertransaction.WindowStateTransactionItem.execute:59 D/VRI[MainActivity]( 7845): vri.Setup new sync=wmsSync-VRI[MainActivity]#7 D/VRI[MainActivity]( 7845): vri.reportDrawFinished D/VRI[MainActivity]( 7845): vri.reportNextDraw android.view.ViewRootImpl.handleResized:2768 android.view.ViewRootImpl.-$$Nest$mhandleResized:0 android.view.ViewRootImpl$W.resized:12716 android.app.servertransaction.WindowStateResizeItem.execute:64 android.app.servertransaction.WindowStateTransactionItem.execute:59 D/VRI[MainActivity]( 7845): vri.Setup new sync=wmsSync-VRI[MainActivity]#9 D/VRI[MainActivity]( 7845): vri.reportDrawFinished I/HandWritingStubImpl( 7845): refreshLastKeyboardType: 1 I/HandWritingStubImpl( 7845): getCurrentKeyboardType: 1 D/VRI[MainActivity]( 7845): vri.reportNextDraw android.view.ViewRootImpl.handleResized:2768 android.view.ViewRootImpl.-$$Nest$mhandleResized:0 android.view.ViewRootImpl$W.resized:12716 android.app.servertransaction.WindowStateResizeItem.execute:64 android.app.servertransaction.WindowStateTransactionItem.execute:59 D/VRI[MainActivity]( 7845): vri.reportNextDraw android.view.ViewRootImpl.performTraversals:4936 android.view.ViewRootImpl.doTraversal:3547 android.view.ViewRootImpl$TraversalRunnable.run:11558 android.view.Choreographer$CallbackRecord.run:1747 android.view.Choreographer$CallbackRecord.run:1756 D/VRI[MainActivity]( 7845): vri.Setup new sync=wmsSync-VRI[MainActivity]#12 D/VRI[MainActivity]( 7845): vri.reportDrawFinished E/Surface ( 7845): freeAllBuffers: 1 buffers were freed while being dequeued!
设备/环境
- 系统:小米HyperOS 2(具体版本未知,日志提及freeform缩放逻辑);
- Flutter版本:稳定通道(从代码结构推断);
- 复现性:重启应用或设备后问题仍持续。
已尝试的排查操作
- 使用固定值(如
width:300)替代MediaQuery,问题依旧; - 验证Flutter组件树结构,布局调试无错误;
- 尝试开启
debugRepaintRainbowEnabled强制软件渲染,无改善。
咨询问题
- 这是否是HyperOS 2与Flutter布局系统在多窗口模式下的已知兼容问题?
- 针对悬浮窗中的尺寸约束,是否有替代组件、平台配置等解决方案?
- 该问题是否与HyperOS的freeform窗口栈管理有关(日志中有所体现)?
补充说明:有屏幕录制演示该问题。因日程紧张,可能无法及时回复,感谢理解与支持!
内容的提问来源于stack exchange,提问作者windy windy
相关产品推荐
相关产品推荐

