Flutter开发中遇到的问题(1)

问题1:

项目地址在:github

在使用FloatingActionButton这个Widget的时候,在使用的时候把FloatingActionButton控件放置到 home所在的page中(也就是iOS中的ViewController 安卓中的Activity)。这个时候的设置是这个样子的:

 //渲染多个浮动按钮
  Widget renderFloatingActionButton() {
    // 一组按钮ButtonBar
    return ButtonBar(
      // 按钮的在水平方向上的对齐方式。
      // spaceAround 分散对齐
      alignment: MainAxisAlignment.spaceAround,
      // 当前组中的组员
      children: <Widget>[
        // 第一个浮动按钮
        FloatingActionButton(
          //点击事件
          onPressed: () {
            choosePic(ImageSource.camera);
          },
          //这只是一个标识长按文字提示
          tooltip: 'photo_camera',
          // 按钮的设置
          child: Icon(Icons.photo_camera),
        ),
        // 第二个浮动按钮
        FloatingActionButton(
          onPressed: () {
            choosePic(ImageSource.gallery);
          },
          tooltip: 'photo_library',
          child: Icon(Icons.photo_library),
        )
      ],
    );
  }

看起来没有什么问题运行起来也没有用什么问题。 但是。。当我把自己练习的demo放在一起的时候,这个页面的上一层是一个item,点击item跳转到当前page。。问题终于出现了。。。。

问题描述:点击item跳转到另外一个页面,另外一个页面底部有两个悬浮的button,点击之后页面黑屏,去掉一个按钮之后,页面正常显示。黑屏的时候控制台报错如下:

报错讯息可能有点长,可以忽略一大部分,这里给出一些能提示你找问题的地方(如果要看详细的报错信息请在页面最后查看):

The following assertion was thrown during a scheduler callback:  
There are multiple heroes that share the same tag within a subtree.  
Within each subtree for which heroes are to be animated (i.e. a PageRoute subtree), each Hero must have a unique non-null tag.  
In this case, multiple heroes had the following tag: <default FloatingActionButton tag>  

大意是:一个子树只能拥有一个tag值。不同子树的tag值不能相同,而你现在的路径中有不止一个子树,这些子树都用了一个默认的tag值。这样就报错了。 知道问题描述了,下面开始追踪到底是哪里出了问题:

Hero(tag: <default FloatingActionButton tag>, state: _HeroState#7f098)  
...
 └Tooltip("photo_library", position: below, dependencies: [TickerMode], state:_TooltipState#232f8

OK,这里定位到了FloatingActionButton 中的Tooltip("photo_library") 也就是我们所写的控件一。
既然说这里用的是默认tag,那么我们更改下tag值问题应该就不存在了吧。接着,我们来看 FloatingActionButton给我们提供了哪些属性:

  FloatingActionButton.extended({
    Key key,
    this.tooltip,
    this.foregroundColor,
    this.backgroundColor,
    this.focusColor,
    this.hoverColor,
    this.heroTag = const _DefaultHeroTag(),
    this.elevation,
    this.focusElevation,
    this.hoverElevation,
    this.highlightElevation,
    this.disabledElevation,
    @required this.onPressed,
    this.shape,
    this.isExtended = true,
    this.materialTapTargetSize,
    this.clipBehavior = Clip.none,
    this.focusNode,
    Widget icon,
    @required Widget label,
  })

我们看到一个属性heroTag而他返回了一个默认值; 我们来看一下这个heroTag以及它的默认值:

/// If this is not explicitly set, then there can only be one
  /// [FloatingActionButton] per route (that is, per screen), since otherwise
  /// there would be a tag conflict (multiple heroes on one route can't have the
  /// same tag). The material design specification recommends only using one
  /// floating action button per screen.

默认值:

class _DefaultHeroTag {  
  const _DefaultHeroTag();
  @override
  String toString() => '<default FloatingActionButton tag>';
}

根据heroTag的定义我们可以知道,在一个页面中,只能存在一个相同的tag值,多个heroes不能使用相同的tag值。而我们的floating action button就是一个hero,并且一个页面出现了两次,如果不设置heroTag就会产生冲突。我们对这个两个FloatingActionButton添加heroTag之后,冲突就解决了。(这个herotag主要是方便做动画效果,具体可参考hero动画)

错误描述全部:

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 (i.e. a PageRoute subtree), each Hero must  
flutter: have a unique non-null tag.  
flutter: In this case, multiple heroes had the following tag: <default FloatingActionButton tag>  
flutter: Here is the subtree for one of the offending heroes:  
flutter: # Hero(tag: <default FloatingActionButton tag>, state: _HeroState#7f098)  
flutter: # └SizedBox(renderObject: RenderConstrainedBox#0b125 relayoutBoundary=up8 NEEDS-PAINT)  
flutter: #  └Offstage(offstage: false, renderObject: RenderOffstage#81335 relayoutBoundary=up9 NEEDS-PAINT)  
flutter: #   └TickerMode(mode: enabled)  
flutter: #    └KeyedSubtree-[GlobalKey#9c6ce]  
flutter: #     └Tooltip("photo_library", position: below, dependencies: [TickerMode], state:  
flutter: _TooltipState#232f8(ticker inactive))  
flutter: #      └GestureDetector(startBehavior: start)  
flutter: #       └RawGestureDetector(state: RawGestureDetectorState#58fc4(gestures: [long press], behavior:  
flutter: opaque))  
flutter: #        └Listener(listeners: [down], behavior: opaque, renderObject: RenderPointerListener#24b9a  
flutter: relayoutBoundary=up10 NEEDS-PAINT)  
flutter: #         └Semantics(container: false, properties: SemanticsProperties, label: "photo_library",  
flutter: value: null, hint: null, hintOverrides: null, dependencies: [Directionality], renderObject:  
flutter: RenderSemanticsAnnotations#c6cc8 relayoutBoundary=up11 NEEDS-PAINT)  
flutter: #          └RawMaterialButton(state: _RawMaterialButtonState#681f5)  
flutter: #           └Semantics(container: true, properties: SemanticsProperties, label: null, value: null,  
flutter: hint: null, hintOverrides: null, renderObject: RenderSemanticsAnnotations#86632  
flutter: relayoutBoundary=up12 NEEDS-PAINT)  
flutter: #            └_InputPadding(renderObject: _RenderInputPadding#90535 relayoutBoundary=up13  
flutter: NEEDS-PAINT)  
flutter: #             └Focus(dependencies: [_FocusMarker], state: _FocusState#ee3c4)  
flutter: #              └_FocusMarker  
flutter: #               └ConstrainedBox(BoxConstraints(w=56.0, h=56.0), renderObject:  
flutter: RenderConstrainedBox#c2ddc relayoutBoundary=up14 NEEDS-PAINT)  
flutter: #                └Material(type: button, elevation: 6.0, color: Color(0xff2196f3),  
flutter: textStyle.debugLabel: (((englishLike button 2014).merge(whiteCupertino button)).copyWith).copyWith,  
flutter: textStyle.inherit: false, textStyle.color: Color(0xffffffff), textStyle.family: .SF UI Text,  
flutter: textStyle.size: 14.0, textStyle.weight: 500, textStyle.letterSpacing: 1.2, textStyle.baseline:  
flutter: alphabetic, textStyle.decoration: TextDecoration.none, shape:  
flutter: CircleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none)), dependencies: [TickerMode],  
flutter: state: _MaterialState#9380e)  
flutter: #                 └_MaterialInterior(duration: 200ms, shape:  
flutter: CircleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none)), elevation: 6.0, color:  
flutter: Color(0xff2196f3), shadowColor: Color(0xff000000), dependencies: [TickerMode, Directionality],  
flutter: state: _MaterialInteriorState#374a9(ticker inactive))  
flutter: #                  └PhysicalShape(clipper: ShapeBorderClipper, elevation: 6.0, color:  
flutter: Color(0xff2196f3), shadowColor: Color(0xff000000), renderObject: RenderPhysicalShape#81092  
flutter: NEEDS-PAINT)  
flutter: #                   └_ShapeBorderPaint(dependencies: [Directionality])  
flutter: #                    └CustomPaint(renderObject: RenderCustomPaint#79891 NEEDS-PAINT)  
flutter: #                     └NotificationListener<LayoutChangedNotification>  
flutter: #                      └_InkFeatures-[GlobalKey#4fbd0 ink renderer](renderObject:  
flutter: _RenderInkFeatures#a166b NEEDS-PAINT)  
flutter: #                       └AnimatedDefaultTextStyle(duration: 200ms, debugLabel: (((englishLike button  
flutter: 2014).merge(whiteCupertino button)).copyWith).copyWith, inherit: false, color: Color(0xffffffff),  
flutter: family: .SF UI Text, size: 14.0, weight: 500, letterSpacing: 1.2, baseline: alphabetic, decoration:  
flutter: TextDecoration.none, softWrap: wrapping at box width, overflow: clip, dependencies: [TickerMode],  
flutter: state: _AnimatedDefaultTextStyleState#0aef0(ticker inactive))  
flutter: #                        └DefaultTextStyle(debugLabel: (((englishLike button  
flutter: 2014).merge(whiteCupertino button)).copyWith).copyWith, inherit: false, color: Color(0xffffffff),  
flutter: family: .SF UI Text, size: 14.0, weight: 500, letterSpacing: 1.2, baseline: alphabetic, decoration:  
flutter: TextDecoration.none, softWrap: wrapping at box width, overflow: clip)  
flutter: #                         └InkWell(gestures: [tap], clipped to BoxShape.rectangle, dependencies:  
flutter: [_FocusMarker], state: _InkResponseState<InkResponse>#527c4)  
flutter: #                          └Listener(listeners: [enter, exit], behavior: translucent, renderObject:  
flutter: RenderPointerListener#e73bd NEEDS-PAINT)  
flutter: #                           └GestureDetector(startBehavior: start)  
flutter: #                            └RawGestureDetector(state: RawGestureDetectorState#14fe4(gestures:  
flutter: [tap], behavior: opaque))  
flutter: #                             └_GestureSemantics(renderObject: RenderSemanticsGestureHandler#18230  
flutter: NEEDS-PAINT)  
flutter: #                              └Listener(listeners: [down], behavior: opaque, renderObject:  
flutter: RenderPointerListener#0c4e6 NEEDS-PAINT)  
flutter: #                               └Builder(dependencies: [IconTheme])  
flutter: #                                └IconTheme(IconThemeData#15fa8(color: Color(0xffffffff)))  
flutter: #                                 └Container(padding: EdgeInsets.zero)  
flutter: #                                  └Padding(padding: EdgeInsets.zero, dependencies:  
flutter: [Directionality], renderObject: RenderPadding#48145 NEEDS-PAINT)  
flutter: #                                   └Center(alignment: center, widthFactor: 1.0, heightFactor: 1.0,  
flutter: dependencies: [Directionality], renderObject: RenderPositionedBox#bd5b3 NEEDS-PAINT)  
flutter: #                                    └Builder(dependencies: [IconTheme])  
flutter: #                                     └IconTheme(IconThemeData#15fa8(color: Color(0xffffffff)))  
flutter: #                                      └Icon(IconData(U+0E413), dependencies: [Directionality,  
flutter: IconTheme])  
flutter: #                                       └Semantics(container: false, properties:  
flutter: SemanticsProperties, label: null, value: null, hint: null, hintOverrides: null, renderObject:  
flutter: RenderSemanticsAnnotations#9a63c relayoutBoundary=up1 NEEDS-PAINT)  
flutter: #                                        └ExcludeSemantics(excluding: true, renderObject:  
flutter: RenderExcludeSemantics#b80fe relayoutBoundary=up2 NEEDS-PAINT)  
flutter: #                                         └SizedBox(width: 24.0, height: 24.0, renderObject:  
flutter: RenderConstrainedBox#b6771 relayoutBoundary=up3 NEEDS-PAINT)  
flutter: #                                          └Center(alignment: center, dependencies:  
flutter: [Directionality], renderObject: RenderPositionedBox#d5b8f NEEDS-PAINT)  
flutter: #                                           └RichText(textDirection: ltr, softWrap: wrapping at box  
flutter: width, overflow: visible, maxLines: unlimited, text: "", dependencies:  
flutter: [_LocalizationsScope-[GlobalKey#955e1]], renderObject: RenderParagraph#df683 relayoutBoundary=up1  
flutter: NEEDS-PAINT)  
flutter:  
flutter:  
flutter: When the exception was thrown, this was the stack:  
flutter: #0      Hero._allHeroesFor.addHero.<anonymous closure> (package:flutter/src/widgets/heroes.dart:265:11)  
flutter: #1      Hero._allHeroesFor.addHero (package:flutter/src/widgets/heroes.dart:275:8)  
flutter: #2      Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:288:20)  
flutter: #3      SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5080:14)  
flutter: #4      Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #5      ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #6      Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #7      SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5080:14)  
flutter: #8      Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #9      MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5181:16)  
flutter: #10     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #11     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5080:14)  
flutter: #12     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #13     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #14     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #15     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5080:14)  
flutter: #16     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #17     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #18     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #19     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5080:14)  
flutter: #20     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #21     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #22     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #23     MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5181:16)  
flutter: #24     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #25     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #26     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #27     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #28     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #29     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #30     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #31     MultiChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5181:16)  
flutter: #32     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #33     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #34     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #35     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #36     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #37     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #38     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #39     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5080:14)  
flutter: #40     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #41     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #42     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #43     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5080:14)  
flutter: #44     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #45     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #46     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #47     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #48     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #49     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #50     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #51     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #52     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #53     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #54     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #55     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #56     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #57     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5080:14)  
flutter: #58     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #59     ComponentElement.visitChildren (package:flutter/src/widgets/framework.dart:3955:14)  
flutter: #60     Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:302:15)  
flutter: #61     SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5080:14)  
flutter: #62     Element.visitChildElements (package:flutter/src/widgets/framework.dart:2820:5)  
flutter: #63     Hero._allHeroesFor (package:flutter/src/widgets/heroes.dart:305:13)  
flutter: #64     HeroController._startHeroTransition (package:flutter/src/widgets/heroes.dart:783:51)  
flutter: #65     HeroController._maybeStartHeroTransition.<anonymous closure> (package:flutter/src/widgets/heroes.dart:757:11)  
flutter: #66     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1016:15)  
flutter: #67     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:966:9)  
flutter: #68     _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:874:5)  
flutter: #72     _invoke (dart:ui/hooks.dart:236:10)  
flutter: #73     _drawFrame (dart:ui/hooks.dart:194:3)  
flutter: (elided 3 frames from package dart:async)  
flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════  

QQ技术交流群:214541576

热爱生活,分享快乐。好记性不如烂笔头。多写,多记,多实践,多思考。

comments powered by Disqus