我正在使用Flutter。我有一个带有3个标签的简单应用。每个带有ListView的选项卡中都有一个RefreshIndicator。这些行是用另一种方法构建的。这是代码:
@override Widget build(BuildContext context) { final GlobalKey<RefreshIndicatorState> _RIKey1 = new GlobalKey<RefreshIndicatorState>(); final GlobalKey<RefreshIndicatorState> _RIKey2 = new GlobalKey<RefreshIndicatorState>(); final GlobalKey<RefreshIndicatorState> _RIKey3 = new GlobalKey<RefreshIndicatorState>(); debugPrint(_RIKey1.toString()); debugPrint(_RIKey2.toString()); debugPrint(_RIKey3.toString()); return new Scaffold( body: new DefaultTabController( length: 3, child: new Scaffold( appBar: new AppBar( bottom: new TabBar( tabs: [ new Tab(icon: new Icon(Icons.view_list)), new Tab(icon: new Icon(Icons.hotel)), new Tab(icon: new Icon(Icons.assessment)), ], ), title: new Text('Data'), ), body: new TabBarView( children: [ new RefreshIndicator( key: _RIKey1, onRefresh: _actualizoData, child: new ListView.builder( padding: new EdgeInsets.only(top: 5.0), itemCount: linea_reservas.length * 2, itemBuilder: (BuildContext context, int position) { if (position.isOdd) return new Divider(); final index = position ~/ 2; return _buildRow(index); }), ), new RefreshIndicator( key: _RIKey2, onRefresh: _actualizoData, child: new ListView.builder( padding: new EdgeInsets.only(top: 8.0), itemCount: linea_inouthouse.length * 2, itemBuilder: (BuildContext context, int position) { if (position.isOdd) return new Divider(); final index = position ~/ 2; return _buildRowInOutHouse(index); }), ), new RefreshIndicator( key: _RIKey3, onRefresh: _actualizoData, child: new ListView.builder( padding: new EdgeInsets.only(top: 5.0), itemCount: linea_ocupacion.length * 2, itemBuilder: (BuildContext context, int position) { if (position.isOdd) return new Divider(); final index = position ~/ 2; return _buildRowOcupacion(index); }), ), ], ), ), ), ); }
我添加了debugPrints,输出为6行,而不是3行。
I/flutter ( 5252): [LabeledGlobalKey<RefreshIndicatorState>#4d76c] I/flutter ( 5252): [LabeledGlobalKey<RefreshIndicatorState>#59b9e] I/flutter ( 5252): [LabeledGlobalKey<RefreshIndicatorState>#2c88b] I/flutter ( 5252): [LabeledGlobalKey<RefreshIndicatorState>#7bd42] I/flutter ( 5252): [LabeledGlobalKey<RefreshIndicatorState>#1c984] I/flutter ( 5252): [LabeledGlobalKey<RefreshIndicatorState>#dbe20]
该应用程序可以运行,但是几次更改标签后,它因以下错误而崩溃:
I/flutter ( 5252): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter ( 5252): The following assertion was thrown building NotificationListener<KeepAliveNotification>: I/flutter ( 5252): Multiple widgets used the same GlobalKey. I/flutter ( 5252): The key [LabeledGlobalKey<RefreshIndicatorState>#7bd42] was used by multiple widgets. The parents of I/flutter ( 5252): those widgets were: I/flutter ( 5252): - RepaintBoundary-[<[LabeledGlobalKey<RefreshIndicatorState>#7bd42]>](renderObject: I/flutter ( 5252): RenderRepaintBoundary#60a4a DETACHED) I/flutter ( 5252): - RepaintBoundary-[<[LabeledGlobalKey<RefreshIndicatorState>#7bd42]>](renderObject: I/flutter ( 5252): RenderRepaintBoundary#c8cdb NEEDS-LAYOUT NEEDS-PAINT) I/flutter ( 5252): A GlobalKey can only be specified on one widget at a time in the widget tree.
密钥是在Build方法中生成的,所以,我不明白为什么会Multiple widgets used the same GlobalKey出错
Multiple widgets used the same GlobalKey
为什么会再次生成密钥,为什么它不是唯一的?我并不是在说一千个意图,在选项卡之间切换4到5次后,错误就会出现。感谢您的任何帮助。
您可以手动创建密钥并使用静态/常量值吗?例如…
import 'package:flutter/widgets.dart'; class RIKeys { static final riKey1 = const Key('__RIKEY1__'); static final riKey2 = const Key('__RIKEY2__'); static final riKey3 = const Key('__RIKEY3__'); }
然后在…
body: new TabBarView( children: [ new RefreshIndicator(new RefreshIndicator( // Use the Manual Static Value instead ... key: RIKeys.riKey1, onRefresh: _actualizoData, child: new ListView.builder( padding: new EdgeInsets.only(top: 5.0), itemCount: linea_reservas.length * 2, itemBuilder: (BuildContext context, int position) { if (position.isOdd) return new Divider(); final index = position ~/ 2; return _buildRow(index); }), ),
我在类似情况下取得了一些成功……尤其是在redux或其他类似模式下……