ParentDatawidget的使用不正确。 parentdatawidget扩展(flex:1)希望将flexparentdata类型的parentdata应用于renderObject,

发布于 2025-02-14 02:00:12 字数 11141 浏览 0 评论 0原文

我在列内使用柔韧性中的标签栏视图。结果,我得到了ParentDatawidget的不正确使用。

这是我身体的代码:

Widget _buildBody() {
    TabController _topTabController = TabController(length: 2, vsync: this, animationDuration: Duration.zero);
    var loc = Utils.getLocalizations(context)!;
    double deviceWidth = Utils.deviceWidth(context);

  
    _topTabController.animateTo(tabIndex);

    _topTabController.addListener(() {
      if (!_topTabController.indexIsChanging) {
        tabIndex = _topTabController.index;
      }
    });

    //this gesture detector ensures that the search bar loses focus when an empty space on the screen is tapped
    return GestureDetector(
      onTap: () => FocusScope.of(context).unfocus(),
      child: Material(
        color: Colors.white,
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            HomePageBanner(title: loc.messagesTitle,),
            Padding(
              padding: const EdgeInsets.only(top: 20),
              child: DecoratedBox(
                decoration: BoxDecoration(
                  //This is for bottom border that is needed
                  border: Border(bottom: BorderSide(color: Colors.grey.shade300, width: 0.8)),
                ),
                child: TabBar(
                  labelColor: Colors.black,
                  labelStyle: const TextStyle(fontWeight: FontWeight.bold),
                  unselectedLabelColor: Colors.black,
                  unselectedLabelStyle: const TextStyle(fontWeight: FontWeight.normal),
                  controller: _topTabController,
                  indicator: const UnderlineTabIndicator(
                    borderSide: BorderSide(color: Colors.black, width: 3.0),
                  ),
                  tabs: [
                    Tab( text: loc.messagesJustMetTabName,),
                    Tab(text: loc.messagesFriendsTabName,)
                  ],
                ),
              ),
            ),
            Flexible(
              child: Padding(
                padding: EdgeInsets.only(left: deviceWidth*0.012, right: deviceWidth*0.012, top: 5),
                child: TabBarView(
                  controller: _topTabController,
                  children: [
                    StatefulBuilder(
                      builder: (BuildContext context, void Function(void Function()) setMetState) {
                        return _justMetTab(context, setMetState);
                      },
                    ),
                    StatefulBuilder(
                      builder: (BuildContext context, void Function(void Function()) setFriendState) {
                        return _friendsTab(context, setFriendState);
                      },
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

我尝试将列包装在尺寸的盒子中并给出固定高度,但这只是使屏幕上的每个小部件都消失了。我还尝试将尺寸的栏本身包裹在大小的盒子中,但所有小部件也消失了。

这是页面外观的一个示例,以更好地理解:

现在看起来都不错,但是当我在测试飞行中运行应用程序时,我会得到一个灰色屏幕ParentDatawidgetError。

编辑: 我在此处添加了Body()方法,以获取_buildbody()位于窗口基上的上下文:

@override
  Widget build(BuildContext context) {
    return FutureBuilder<dynamic>(
      future: getAllChatRequests(), // async work
      builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.waiting: return const Center(child: CircularProgressIndicator());
          default:
            if (snapshot.hasError) {
              return Center(child: Text('Error: ${snapshot.error}'));
            } else {
              return _buildBody();
            }
        }
      },
    );
  }

edit:

还在此处添加错误日志以获取更多上下文:

======== Exception caught by widgets library =======================================================
The following assertion was thrown while applying parent data.:
Incorrect use of ParentDataWidget.

The ParentDataWidget Expanded(flex: 1) wants to apply ParentData of type FlexParentData to a RenderObject, which has been set up to accept ParentData of incompatible type ParentData.

Usually, this means that the Expanded widget has the wrong ancestor RenderObjectWidget. Typically, Expanded widgets are placed directly inside Flex widgets.
The offending Expanded is currently placed inside a RepaintBoundary widget.

The ownership chain for the RenderObject that received the incompatible parent data was:
  Padding ← Expanded ← StatefulBuilder ← KeyedSubtree-[<0>] ← RepaintBoundary ← IndexedSemantics ← NotificationListener<KeepAliveNotification> ← KeepAlive ← AutomaticKeepAlive ← KeyedSubtree-[Key <[<0>]>] ← ⋯
When the exception was thrown, this was the stack: 
#0      RenderObjectElement._updateParentData.<anonymous closure> (package:flutter/src/widgets/framework.dart:5960:11)
#1      RenderObjectElement._updateParentData (package:flutter/src/widgets/framework.dart:5977:6)
#2      RenderObjectElement.attachRenderObject (package:flutter/src/widgets/framework.dart:5999:7)
#3      RenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5673:5)
#4      SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6214:11)
...     Normal element mounting (53 frames)
#57     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3817:16)
#58     Element.updateChild (package:flutter/src/widgets/framework.dart:3551:18)
#59     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1265:37)
#60     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1250:20)
#61     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2597:19)
#62     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1242:12)
#63     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:349:23)
#64     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:2025:59)
#65     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:918:15)
#66     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:2025:14)
#67     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:338:5)
#68     RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:422:5)
#69     RenderSliverFixedExtentBoxAdaptor.performLayout (package:flutter/src/rendering/sliver_fixed_extent_list.dart:205:12)
#70     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#71     RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:137:12)
#72     _RenderSliverFractionalPadding.performLayout (package:flutter/src/widgets/sliver_fill.dart:167:11)
#73     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#74     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:510:13)
#75     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1580:12)
#76     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1489:20)
#77     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#78     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#79     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#80     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#81     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#82     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#83     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#84     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#85     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#86     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#87     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#88     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#89     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#90     RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:233:12)
#91     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#92     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:56:11)
#93     RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:896:45)
#94     RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:931:32)
#95     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#96     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#97     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#98     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#99     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1376:11)
#100    RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#101    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#102    RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#103    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#104    RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#105    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#106    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1757:7)
#107    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:887:18)
#108    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:504:19)
#109    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:892:13)
#110    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:370:5)
#111    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1146:15)
#112    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1083:9)
#113    SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:997:5)
#117    _invoke (dart:ui/hooks.dart:151:10)
#118    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5)
#119    _drawFrame (dart:ui/hooks.dart:115:31)
(elided 3 frames from dart:async)
====================================================================================================

I am using a tab bar view in a flexible, which is inside a column. As a result, I am getting the incorrect use of ParentDataWidget.

Here's the code to my body:

Widget _buildBody() {
    TabController _topTabController = TabController(length: 2, vsync: this, animationDuration: Duration.zero);
    var loc = Utils.getLocalizations(context)!;
    double deviceWidth = Utils.deviceWidth(context);

  
    _topTabController.animateTo(tabIndex);

    _topTabController.addListener(() {
      if (!_topTabController.indexIsChanging) {
        tabIndex = _topTabController.index;
      }
    });

    //this gesture detector ensures that the search bar loses focus when an empty space on the screen is tapped
    return GestureDetector(
      onTap: () => FocusScope.of(context).unfocus(),
      child: Material(
        color: Colors.white,
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            HomePageBanner(title: loc.messagesTitle,),
            Padding(
              padding: const EdgeInsets.only(top: 20),
              child: DecoratedBox(
                decoration: BoxDecoration(
                  //This is for bottom border that is needed
                  border: Border(bottom: BorderSide(color: Colors.grey.shade300, width: 0.8)),
                ),
                child: TabBar(
                  labelColor: Colors.black,
                  labelStyle: const TextStyle(fontWeight: FontWeight.bold),
                  unselectedLabelColor: Colors.black,
                  unselectedLabelStyle: const TextStyle(fontWeight: FontWeight.normal),
                  controller: _topTabController,
                  indicator: const UnderlineTabIndicator(
                    borderSide: BorderSide(color: Colors.black, width: 3.0),
                  ),
                  tabs: [
                    Tab( text: loc.messagesJustMetTabName,),
                    Tab(text: loc.messagesFriendsTabName,)
                  ],
                ),
              ),
            ),
            Flexible(
              child: Padding(
                padding: EdgeInsets.only(left: deviceWidth*0.012, right: deviceWidth*0.012, top: 5),
                child: TabBarView(
                  controller: _topTabController,
                  children: [
                    StatefulBuilder(
                      builder: (BuildContext context, void Function(void Function()) setMetState) {
                        return _justMetTab(context, setMetState);
                      },
                    ),
                    StatefulBuilder(
                      builder: (BuildContext context, void Function(void Function()) setFriendState) {
                        return _friendsTab(context, setFriendState);
                      },
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

I have tried wrapping the column in a sized box and giving it a fixed height, but this just makes every widget on the screen disappear. I have also tried wrapping the sized bar itself in a sized box, but all the widgets disappear as well.

Here's an example of the what the page looks like for better understanding:
Screen

It all looks good now, but when I run the app in test flight, I get a grey screen because of the ParentDataWidgetError.

EDIT:
I have added the body() method here for context on where _buildBody() is located in the widget tree:

@override
  Widget build(BuildContext context) {
    return FutureBuilder<dynamic>(
      future: getAllChatRequests(), // async work
      builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
        switch (snapshot.connectionState) {
          case ConnectionState.waiting: return const Center(child: CircularProgressIndicator());
          default:
            if (snapshot.hasError) {
              return Center(child: Text('Error: ${snapshot.error}'));
            } else {
              return _buildBody();
            }
        }
      },
    );
  }

EDIT:

Also adding the error log here for more context:

======== Exception caught by widgets library =======================================================
The following assertion was thrown while applying parent data.:
Incorrect use of ParentDataWidget.

The ParentDataWidget Expanded(flex: 1) wants to apply ParentData of type FlexParentData to a RenderObject, which has been set up to accept ParentData of incompatible type ParentData.

Usually, this means that the Expanded widget has the wrong ancestor RenderObjectWidget. Typically, Expanded widgets are placed directly inside Flex widgets.
The offending Expanded is currently placed inside a RepaintBoundary widget.

The ownership chain for the RenderObject that received the incompatible parent data was:
  Padding ← Expanded ← StatefulBuilder ← KeyedSubtree-[<0>] ← RepaintBoundary ← IndexedSemantics ← NotificationListener<KeepAliveNotification> ← KeepAlive ← AutomaticKeepAlive ← KeyedSubtree-[Key <[<0>]>] ← ⋯
When the exception was thrown, this was the stack: 
#0      RenderObjectElement._updateParentData.<anonymous closure> (package:flutter/src/widgets/framework.dart:5960:11)
#1      RenderObjectElement._updateParentData (package:flutter/src/widgets/framework.dart:5977:6)
#2      RenderObjectElement.attachRenderObject (package:flutter/src/widgets/framework.dart:5999:7)
#3      RenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5673:5)
#4      SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:6214:11)
...     Normal element mounting (53 frames)
#57     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3817:16)
#58     Element.updateChild (package:flutter/src/widgets/framework.dart:3551:18)
#59     SliverMultiBoxAdaptorElement.updateChild (package:flutter/src/widgets/sliver.dart:1265:37)
#60     SliverMultiBoxAdaptorElement.createChild.<anonymous closure> (package:flutter/src/widgets/sliver.dart:1250:20)
#61     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2597:19)
#62     SliverMultiBoxAdaptorElement.createChild (package:flutter/src/widgets/sliver.dart:1242:12)
#63     RenderSliverMultiBoxAdaptor._createOrObtainChild.<anonymous closure> (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:349:23)
#64     RenderObject.invokeLayoutCallback.<anonymous closure> (package:flutter/src/rendering/object.dart:2025:59)
#65     PipelineOwner._enableMutationsToDirtySubtrees (package:flutter/src/rendering/object.dart:918:15)
#66     RenderObject.invokeLayoutCallback (package:flutter/src/rendering/object.dart:2025:14)
#67     RenderSliverMultiBoxAdaptor._createOrObtainChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:338:5)
#68     RenderSliverMultiBoxAdaptor.addInitialChild (package:flutter/src/rendering/sliver_multi_box_adaptor.dart:422:5)
#69     RenderSliverFixedExtentBoxAdaptor.performLayout (package:flutter/src/rendering/sliver_fixed_extent_list.dart:205:12)
#70     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#71     RenderSliverEdgeInsetsPadding.performLayout (package:flutter/src/rendering/sliver_padding.dart:137:12)
#72     _RenderSliverFractionalPadding.performLayout (package:flutter/src/widgets/sliver_fill.dart:167:11)
#73     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#74     RenderViewportBase.layoutChildSequence (package:flutter/src/rendering/viewport.dart:510:13)
#75     RenderViewport._attemptLayout (package:flutter/src/rendering/viewport.dart:1580:12)
#76     RenderViewport.performLayout (package:flutter/src/rendering/viewport.dart:1489:20)
#77     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#78     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#79     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#80     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#81     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#82     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#83     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#84     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#85     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#86     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#87     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#88     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#89     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#90     RenderPadding.performLayout (package:flutter/src/rendering/shifted_box.dart:233:12)
#91     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#92     ChildLayoutHelper.layoutChild (package:flutter/src/rendering/layout_helper.dart:56:11)
#93     RenderFlex._computeSizes (package:flutter/src/rendering/flex.dart:896:45)
#94     RenderFlex.performLayout (package:flutter/src/rendering/flex.dart:931:32)
#95     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#96     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#97     RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#98     RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#99     _RenderCustomClip.performLayout (package:flutter/src/rendering/proxy_box.dart:1376:11)
#100    RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#101    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#102    RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#103    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#104    RenderObject.layout (package:flutter/src/rendering/object.dart:1915:7)
#105    RenderProxyBoxMixin.performLayout (package:flutter/src/rendering/proxy_box.dart:116:14)
#106    RenderObject._layoutWithoutResize (package:flutter/src/rendering/object.dart:1757:7)
#107    PipelineOwner.flushLayout (package:flutter/src/rendering/object.dart:887:18)
#108    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:504:19)
#109    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:892:13)
#110    RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:370:5)
#111    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1146:15)
#112    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1083:9)
#113    SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:997:5)
#117    _invoke (dart:ui/hooks.dart:151:10)
#118    PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5)
#119    _drawFrame (dart:ui/hooks.dart:115:31)
(elided 3 frames from dart:async)
====================================================================================================

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凹づ凸ル 2025-02-21 02:00:12

您在这里不需要灵活的小部件。.请删除灵活性。或者,如果您希望将其保留,则用与设备相同的尺寸盒子包裹列,并使用弹性扩展。

You dont need the flexible widget here.. please remove the flexible. Or if you wish to keep it wrap the column with a sized box of size same as device and use expanded in place of flexible.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文