Flutter使用了不匹配的父级 RenderObjectWidget

记录下实际开发遇到的问题,希望不使用 AppBar,但是在导航栏实现一个顶部左边返回和右侧功能按钮,但为了适配屏幕,于是想到了把

Positioned 组件   写到
SafeArea 组件  里,可以正常运行,但运行报了如下错误

======== Exception caught by widgets library ======================================================= The following assertion was thrown while applying parent data.: Incorrect use of ParentDataWidget. The ParentDataWidget Positioned(left: 16.0, top: 16.0) wants to apply ParentData of type StackParentData to a RenderObject, which has been set up to accept ParentData of incompatible type BoxParentData. Usually, this means that the Positioned widget has the wrong ancestor RenderObjectWidget. Typically, Positioned widgets are placed directly inside Stack widgets. The offending Positioned is currently placed inside a Padding widget. The ownership chain for the RenderObject that received the incompatible parent data was: Semantics ← IconButton ← Positioned ← MediaQuery ← Padding ← SafeArea ← Stack ← KeyedSubtree-[GlobalKey#efd8c] ← _BodyBuilder ← MediaQuery ← ⋯ When the exception was thrown, this was the stack: #0 RenderObjectElement._updateParentData.<anonymous closure> (package:flutter/src/widgets/framework.dart:6231:11) #1 RenderObjectElement._updateParentData (package:flutter/src/widgets/framework.dart:6248:6) #2 RenderObjectElement.attachRenderObject (package:flutter/src/widgets/framework.dart:6271:7) #3 RenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5943:5) #4 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6434:11) ... Normal element mounting (28 frames) #32 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3971:16) #33 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6570:36) #34 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6582:32) ... Normal element mounting (25 frames) #59 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3971:16) #60 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6570:36) #61 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6582:32) ... Normal element mounting (134 frames) #195 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3971:16) #196 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6570:36) #197 MultiChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6582:32) ... Normal element mounting (178 frames) #375 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3971:16) #376 MultiChildRenderObjectElement.inflateWidget (package:flutter/src/widgets/framework.dart:6570:36) #377 Element.updateChild (package:flutter/src/widgets/framework.dart:3708:18) #378 RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:6153:32) #379 MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6595:17) #380 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #381 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #382 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #383 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #384 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #385 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #386 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #387 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #388 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #389 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #390 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #391 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #392 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #393 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11) #394 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #395 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #396 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #397 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #398 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #399 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #400 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #401 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #402 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #403 _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:107:11) #404 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #405 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #406 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #407 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #408 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #409 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #410 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #411 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #412 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #413 StatefulElement.update (package:flutter/src/widgets/framework.dart:5274:5) #414 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #415 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14) #416 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #417 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6442:14) #418 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #419 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #420 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #421 ProxyElement.update (package:flutter/src/widgets/framework.dart:5417:5) #422 Element.updateChild (package:flutter/src/widgets/framework.dart:3686:15) #423 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:5111:16) #424 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:5251:11) #425 Element.rebuild (package:flutter/src/widgets/framework.dart:4805:7) #426 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2780:19) #427 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:903:21) #428 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:358:5) #429 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1284:15) #430 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1214:9) #431 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:1072:5) #432 _invoke (dart:ui/hooks.dart:142:13) #433 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:359:5) #434 _drawFrame (dart:ui/hooks.dart:112:31) ====================================================================================================

后查询原因
 

在 Positioned widget 内部,使用了不匹配的父级 RenderObjectWidget。通常情况下,Positioned widget 应直接放置在 Stack widget 内部,但是在此情况下,它被放置在 Padding widget 内部。

根据错误消息的堆栈信息,RenderObject(渲染对象)的所有权链路中,出现了类型不匹配的 ParentData。具体而言,Positioned widget 需要将类型为 StackParentData 的 ParentData 应用于 RenderObject,但是它已经设置为接受类型不兼容的 BoxParentData。

为了解决这个问题,可以按照以下步骤操作:

  1. 将 Positioned widget 直接放置在 Stack widget 内部。确保 Positioned widget 的直接父级是 Stack widget。

示例代码

Stack( children: [ // 其他子部件 Positioned( left: 16.0, top: 16.0, child: YourChildWidget(), ), ], )

  1. 如果仍然需要在 Positioned widget 和 Stack widget 之间添加 Padding,可以将 Padding widget 放置在 Positioned widget 的 child 属性中,而不是将 Positioned widget 放置在 Padding widget 内部。

示例代码:

Stack( children: [ // 其他子部件 Positioned( left: 16.0, top: 16.0, child: Padding( padding: EdgeInsets.all(16.0), child: YourChildWidget(), ), ), ], )

通过这些更改,应该能够解决父级数据错误的问题。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值