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<MyHomePage> {
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: <Widget>[
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: () {
//導(dǎo)航到新路由
Navigator.push(context, MaterialPageRoute(builder: (context) {
return NewRoute();
}));
},
),
],
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
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.
);
}
}
點(diǎn)擊按鈕跳轉(zhuǎn)頁面就報(bào)錯(cuò)
FlatButton(
child: Text("open new route"),
textColor: Colors.blue,
onPressed: () {
//導(dǎo)航到新路由
Navigator.push(context, MaterialPageRoute(builder: (context) {
return NewRoute();
}));
},
),
報(bào)錯(cuò)內(nèi)容:
════════ 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: <default FloatingActionButton tag>
Here is the subtree for one of the offending heroes:
# Hero(tag: <default FloatingActionButton 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<LayoutChangedNotification>
# └_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<InkResponse>#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.<anonymous closure> (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)
國外有一篇國外網(wǎng)友的錯(cuò)誤 是記錄他的錯(cuò)誤,我的錯(cuò)誤和他一樣,正常點(diǎn)理解就是類似于Android里面兩個(gè)空間搶占了焦點(diǎn),是這個(gè)意思,我是這樣理解的,但是按照flutter來說,是子樹的獲取點(diǎn)擊事件被 c這個(gè)組件攔截,從而使 子樹的點(diǎn)擊被 FloatingActionButton 占領(lǐng),解決的辦法就是不要把 FloatingActionButton 和別的點(diǎn)擊空間放置在同一樹下,比如 共同當(dāng)做item 放置在了 listview下,這樣就會(huì)出現(xiàn)這樣的問題;
解決方案
刪除FloatingActionButton 的代碼就好了。