import 'package:flutter/material.dart';
import 'Page/NewRoute.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Home'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.display1,
),
FlatButton(
child: Text("open new route"),
textColor: Colors.blue,
onPressed: () {
//导航到新路由
Navigator.push(context, MaterialPageRoute(builder: (context) {
return NewRoute();
}));
},
),
],
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
foregroundColor: Colors.white,
backgroundColor: Colors.cyan,
child: Icon(Icons.exposure_plus_1),
),
],
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
点击按钮跳转页面就报错
FlatButton(
child: Text("open new route"),
textColor: Colors.blue,
onPressed: () {
//导航到新路由
Navigator.push(context, MaterialPageRoute(builder: (context) {
return NewRoute();
}));
},
),
报错内容:
════════ Exception caught by scheduler library ═════════════════════════════════════════════════════
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:
Here is the subtree for one of the offending heroes:
# Hero(tag: , state: _HeroState#5a900)
# └SizedBox(renderObject: RenderConstrainedBox#e0670 relayoutBoundary=up6)
# └Offstage(offstage: false, renderObject: RenderOffstage#d8aa1 relayoutBoundary=up7)
# └TickerMode(mode: enabled)
# └KeyedSubtree-[GlobalKey#2e7b4]
# └Tooltip("decrement", dependencies: [_LocalizationsScope-[GlobalKey#624f7], _InheritedTheme, TickerMode], state: _TooltipState#50e7f(ticker inactive))
# └GestureDetector(startBehavior: start)
# └RawGestureDetector(state: RawGestureDetectorState#d9c12(gestures: [long press], excludeFromSemantics: true, behavior: opaque))
# └Listener
# └_PointerListener(listeners: [down], behavior: opaque, renderObject: RenderPointerListener#4ab1e relayoutBoundary=up8)
# └Semantics(container: false, properties: SemanticsProperties, label: "decrement", value: null, hint: null, hintOverrides: null, dependencies: [Directionality], renderObject: RenderSemanticsAnnotations#71fff relayoutBoundary=up9)
# └RawMaterialButton(state: _RawMaterialButtonState#72b4c)
# └Semantics(container: true, properties: SemanticsProperties, label: null, value: null, hint: null, hintOverrides: null, renderObject: RenderSemanticsAnnotations#e5b8d relayoutBoundary=up10)
# └_InputPadding(renderObject: _RenderInputPadding#ea3bd relayoutBoundary=up11)
# └Focus(dependencies: [_FocusMarker], state: _FocusState#2ef17)
# └_FocusMarker
# └ConstrainedBox(BoxConstraints(w=56.0, h=56.0), renderObject: RenderConstrainedBox#953c3 relayoutBoundary=up12)
# └Material(type: button, elevation: 6.0, color: MaterialColor(primary value: Color(0xffff9800)), textStyle.debugLabel: (((englishLike button 2014).merge(whiteMountainView button)).copyWith).copyWith, textStyle.inherit: false, textStyle.color: Color(0xffffffff), textStyle.family: Roboto, textStyle.size: 14.0, textStyle.weight: 500, textStyle.letterSpacing: 1.2, textStyle.baseline: alphabetic, textStyle.decoration: TextDecoration.none, shape: CircleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none)), dependencies: [_LocalizationsScope-[GlobalKey#624f7], _InheritedTheme, TickerMode], state: _MaterialState#f3e54)
# └_MaterialInterior(duration: 200ms, shape: CircleBorder(BorderSide(Color(0xff000000), 0.0, BorderStyle.none)), elevation: 6.0, color: MaterialColor(primary value: Color(0xffff9800)), shadowColor: Color(0xff000000), dependencies: [_LocalizationsScope-[GlobalKey#624f7], Directionality, _InheritedTheme, TickerMode], state: _MaterialInteriorState#82dfe(ticker inactive))
# └PhysicalShape(clipper: ShapeBorderClipper, elevation: 6.0, color: MaterialColor(primary value: Color(0xffff9800)), shadowColor: Color(0xff000000), renderObject: RenderPhysicalShape#f96ad)
# └_ShapeBorderPaint(dependencies: [Directionality])
# └CustomPaint(renderObject: RenderCustomPaint#22c85)
# └NotificationListener
# └_InkFeatures-[GlobalKey#f58ae ink renderer](renderObject: _RenderInkFeatures#10c41)
# └AnimatedDefaultTextStyle(duration: 200ms, debugLabel: (((englishLike button 2014).merge(whiteMountainView button)).copyWith).copyWith, inherit: false, color: Color(0xffffffff), family: Roboto, size: 14.0, weight: 500, letterSpacing: 1.2, baseline: alphabetic, decoration: TextDecoration.none, softWrap: wrapping at box width, overflow: clip, dependencies: [TickerMode], state: _AnimatedDefaultTextStyleState#07526(ticker inactive))
# └DefaultTextStyle(debugLabel: (((englishLike button 2014).merge(whiteMountainView button)).copyWith).copyWith, inherit: false, color: Color(0xffffffff), family: Roboto, size: 14.0, weight: 500, letterSpacing: 1.2, baseline: alphabetic, decoration: TextDecoration.none, softWrap: wrapping at box width, overflow: clip)
# └InkWell(gestures: [tap], clipped to BoxShape.rectangle, dependencies: [_FocusMarker], state: _InkResponseState#2fd92)
# └MouseRegion(listeners: [enter, exit], renderObject: RenderMouseRegion#e52ee)
# └GestureDetector(startBehavior: start)
# └RawGestureDetector(state: RawGestureDetectorState#d53b3(gestures: [tap], behavior: opaque))
# └_GestureSemantics(renderObject: RenderSemanticsGestureHandler#94515)
# └Listener
# └_PointerListener(listeners: [down], behavior: opaque, renderObject: RenderPointerListener#d7e87)
# └Builder(dependencies: [IconTheme])
# └IconTheme(IconThemeData#15fa8(color: Color(0xffffffff)))
# └Container(padding: EdgeInsets.zero)
# └Padding(padding: EdgeInsets.zero, dependencies: [Directionality], renderObject: RenderPadding#35ace)
# └Center(alignment: center, widthFactor: 1.0, heightFactor: 1.0, dependencies: [Directionality], renderObject: RenderPositionedBox#ed513)
# └Icon(IconData(U+0E3CB), dependencies: [Directionality, IconTheme])
# └Semantics(container: false, properties: SemanticsProperties, label: null, value: null, hint: null, hintOverrides: null, renderObject: RenderSemanticsAnnotations#10f97 relayoutBoundary=up1)
# └ExcludeSemantics(excluding: true, renderObject: RenderExcludeSemantics#49a4b relayoutBoundary=up2)
# └SizedBox(width: 24.0, height: 24.0, renderObject: RenderConstrainedBox#ce5bc relayoutBoundary=up3)
# └Center(alignment: center, dependencies: [Directionality], renderObject: RenderPositionedBox#4fd6c)
# └RichText(textDirection: ltr, softWrap: wrapping at box width, overflow: visible, maxLines: unlimited, text: "", dependencies: [_LocalizationsScope-[GlobalKey#624f7]], renderObject: RenderParagraph#a9bd9 relayoutBoundary=up1)
When the exception was thrown, this was the stack:
#0 Hero._allHeroesFor.inviteHero. (package:flutter/src/widgets/heroes.dart:265:11)
#1 Hero._allHeroesFor.inviteHero (package:flutter/src/widgets/heroes.dart:275:8)
#2 Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:294:21)
#3 SingleChildRenderObjectElement.visitChildren (package:flutter/src/widgets/framework.dart:5117:14)
#4 Hero._allHeroesFor.visitor (package:flutter/src/widgets/heroes.dart:307:15)
国外有一篇国外网友的错误 是记录他的错误,我的错误和他一样,正常点理解就是类似于Android里面两个空间抢占了焦点,是这个意思,我是这样理解的,但是按照flutter来说,是子树的获取点击事件被 c这个组件拦截,从而使 子树的点击被 FloatingActionButton 占领,解决的办法就是不要把 FloatingActionButton 和别的点击空间放置在同一树下,比如 共同当做item 放置在了 listview下,这样就会出现这样的问题;
解决方案
删除FloatingActionButton 的代码就好了。