重复使用带有Cupertino导航栏的小部件

时间:2019-02-21 08:07:50

标签: flutter

我有一个“表列表”小部件,列出了一些结果,我想从2个不同的来源重用此小部件。 这是方法:

  • “ View1”-> 来源1
  • “ View2”-> 源2
  • “ View3”->列表为 TL
  • 的表
+--------------------+
| Source 1|          |
+---------+     +----v-----+
                |Table with|
                |results   |
+---------+     +----+-----+
| Source 2|          ^
+--------------------+

每个来源都具有在 TL 内部传递信息的路由。

这是 TL build功能:

@override
  Widget build(BuildContext context) {
    return CupertinoPageScaffold(
      navigationBar: CupertinoNavigationBar(middle: Text('Post Recenti')),
      child: PostsTableList(showPostForCategoryID)
      );
  }

但是当显示 TL 时,出现以下错误:

flutter: ══╡ EXCEPTION CAUGHT BY SCHEDULER LIBRARY ╞═════════════════════════════════════════════════════════
flutter: The following assertion was thrown during a scheduler callback:
flutter: There are multiple heroes that share the same tag within a subtree.
flutter: Within each subtree for which heroes are to be animated (typically a PageRoute subtree), each Hero
flutter: must have a unique non-null tag.
flutter: In this case, multiple heroes had the following tag: Default Hero tag for Cupertino navigation bars
flutter: with navigator NavigatorState#090ce(tickers: tracking 2 tickers)
flutter: Here is the subtree for one of the offending heroes:
flutter: # Hero(tag: Default Hero tag for Cupertino navigation bars with navigator NavigatorState#090ce(tickers: tracking 2 tickers), state: _HeroState#4dc1f)
flutter: # └KeyedSubtree-[GlobalKey#9d61d]
flutter: #  └_TransitionableNavigationBar-[GlobalKey#f21fd Navigation bar render box]
flutter: #   └ClipRect(renderObject: RenderClipRect#5922f relayoutBoundary=up1)
flutter: #    └BackdropFilter(renderObject: RenderBackdropFilter#ca8c7 relayoutBoundary=up2)
flutter: #     └DecoratedBox(bg: BoxDecoration(color: Color(0xccf8f8f8), border: Border(bottom: BorderSide(Color(0x4c000000), 0.0, BorderStyle.solid))), renderObject: RenderDecoratedBox#0c666 relayoutBoundary=up3)
flutter: #      └AnnotatedRegion<SystemUiOverlayStyle>(renderObject: RenderAnnotatedRegion<SystemUiOverlayStyle>#21621 relayoutBoundary=up4)
flutter: #       └_PersistentNavigationBar
flutter: #        └SizedBox(height: 64.0, renderObject: RenderConstrainedBox#826b3 relayoutBoundary=up5)
flutter: #         └SafeArea(avoid left padding, avoid top padding, avoid right padding, avoid bottom padding)
flutter: #          └Padding(padding: EdgeInsets(0.0, 20.0, 0.0, 0.0), renderObject: RenderPadding#bebdd)
flutter: #           └MediaQuery(MediaQueryData(size: Size(375.0, 667.0), devicePixelRatio: 2.0, textScaleFactor: 1.0, padding: EdgeInsets(0.0, 0.0, 0.0, 50.0), viewInsets: EdgeInsets.zero, alwaysUse24HourFormat: false, accessibleNavigation: falsedisableAnimations: falseinvertColors: falseboldText: false))
flutter: #            └NavigationToolbar
flutter: #             └CustomMultiChildLayout(renderObject: RenderCustomMultiChildLayoutBox#18992)
flutter: #              └LayoutId-[<_ToolbarSlot.middle>](id: _ToolbarSlot.middle)
flutter: #               └DefaultTextStyle(inherit: true, color: Color(0xff000000), family: .SF UI Text, size: 17.0, weight: 600, letterSpacing: -0.1, softWrap: wrapping at box width, overflow: clip)
flutter: #                └Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null, hintOverrides: null, renderObject: RenderSemanticsAnnotations#abf4c relayoutBoundary=up1)
flutter: #                 └KeyedSubtree-[GlobalKey#0daf7 Middle]
flutter: #                  └Text("Categorie")
flutter: #                   └RichText(softWrap: wrapping at box width, maxLines: unlimited, text: "Categorie", renderObject: RenderParagraph#ad5eb relayoutBoundary=up2)
flutter:
flutter: When the exception was thrown, this was the stack:
flutter: #0      Hero._allHeroesFor.visitor.<anonymous closure> (package:flutter/src/widgets/heroes.dart:210:15)
flutter: #1      Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:220:12)
flutter: #2      ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #3      Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #4      ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #5      Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #6      MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4948:16)
flutter: #7      Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #8      SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4848:14)
flutter: #9      Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #10     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #11     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #12     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #13     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #14     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #15     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #16     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4848:14)
flutter: #17     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #18     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #19     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #20     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #21     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #22     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4848:14)
flutter: #23     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #24     MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4948:16)
flutter: #25     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #26     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #27     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #28     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #29     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #30     MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4948:16)
flutter: #31     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #32     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #33     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #34     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #35     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #36     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4848:14)
flutter: #37     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #38     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3755:14)
flutter: #39     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:225:15)
flutter: #40     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:4848:14)
flutter: #41     Element.visitChildElements (package:flutter/src/widgets/framework.dart:2686:5)
flutter: #42     Hero._allHeroesFor (package:flutter/src/widgets/heroes.dart:227:13)
flutter: #43     HeroController._startHeroTransition (package:flutter/src/widgets/heroes.dart:655:53)
flutter: #44     HeroController._maybeStartHeroTransition.<anonymous closure> (package:flutter/src/widgets/heroes.dart:630:11)
flutter: #45     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:990:15)
flutter: #46     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:938:9)
flutter: #47     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:842:5)
flutter: #48     _invoke (dart:ui/hooks.dart:154:13)
flutter: #49     _drawFrame (dart:ui/hooks.dart:143:3)
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════

由于我是Flutter的新手,所以有什么我忘了的东西吗?我使用的方式有误吗?

Searching around我也发现了这一点,但我不知道这是否与它无关:

By default, only one [CupertinoNavigationBar] or [CupertinoSliverNavigationBar]
/// should be present in each [PageRoute] to support the default transitions.
/// Use [transitionBetweenRoutes] or [heroTag] to customize the transition
/// behavior for multiple navigation bars per route.

2 个答案:

答案 0 :(得分:1)

如错误所述-

  

多个英雄具有以下标签:Cupertino的默认Hero标签   导航栏

您正在使用-CupertinoNavigationBar两次-且未定义Hero标签值,因此无法选择默认值。Default

这里的技巧是向每个CupertinoNavigationBar heroTag:

传递一些唯一的值
CupertinoNavigationBar(middle: Text('Post Recenti'),
          heroTag: 'uniquevalue',),  // Pass different unique value for each
  

每个来源都有一条传递TL内部信息的路由。

还要为CupertinoNavigationBar heroTag:传递唯一值

答案 1 :(得分:1)

  

多个英雄使用以下标签:默认

因此,您正在使用两个或更多个需要herotag的小部件,而没有定义一个。解决方案很简单

为每个CupertinoNavigationBar()

设置一个唯一的英雄标签