Skip to content

Commit 8ab91f3

Browse files
epoll-jLuozf12345
andauthored
TDMultiCascader: 修复initialIndexes 参数不生效 (Tencent#752)
* feat(级联选择器): 增加通过索引列表初始化选中位置的功能 * feat(级联选择器): 添加使用initialIndexes设置默认值的功能 * refactor(cascader): 移除冗余注释 * refactor(cascader): 使用TDCell实现示例代码 --------- Co-authored-by: Luozf <[email protected]>
1 parent 8cbae6f commit 8ab91f3

File tree

2 files changed

+88
-11
lines changed

2 files changed

+88
-11
lines changed

tdesign-component/example/lib/page/td_cascader_page.dart

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ class _TDCascaderPageState extends State<TDCascaderPage> {
312312
ExampleItem(desc: '测试使用次标题', builder: _buildVerticalSubTitleCascader),
313313
ExampleItem(desc: '垂直级联选择器-部门', builder: _buildTestVerticalCompanyCascader),
314314
ExampleItem(desc: '选择任意项', builder: _buildSelectAnyItemCascader),
315+
ExampleItem(desc: '使用initialIndexes设置默认值', builder: _buildWithInitialIndexes),
315316
],
316317
),
317318
);
@@ -579,4 +580,36 @@ class _TDCascaderPageState extends State<TDCascaderPage> {
579580
);
580581
});
581582
}
583+
584+
@Demo(group: 'cascader')
585+
Widget _buildWithInitialIndexes(BuildContext context) {
586+
return TDCell(
587+
title: '选择地区',
588+
note: _selected_1.isEmpty ? '请选择' : _selected_1,
589+
arrow: true,
590+
onClick: (click) {
591+
TDCascader.showMultiCascader(
592+
context,
593+
title: '选择地址',
594+
data: _data,
595+
initialIndexes: [0, 0, 1],
596+
theme: 'step',
597+
onChange: (List<MultiCascaderListModel> selectData) {
598+
setState(() {
599+
var result = [];
600+
var len = selectData.length;
601+
_initData = selectData[len - 1].value!;
602+
selectData.forEach((element) {
603+
result.add(element.label);
604+
});
605+
_selected_1 = result.join('/');
606+
});
607+
},
608+
onClose: () {
609+
Navigator.of(context).pop();
610+
},
611+
);
612+
},
613+
);
614+
}
582615
}

tdesign-component/lib/src/components/cascader/td_multi_cascader.dart

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -115,21 +115,25 @@ class _TDMultiCascaderState extends State<TDMultiCascader>
115115
if (widget.isLetterSort) {
116116
_listDataSegmenter();
117117
}
118-
_initLocation(widget.initialData ?? '');
118+
// 优先使用 initialIndexes,如果没有则使用 initialData
119+
String? initValue;
120+
if (widget.initialIndexes != null && widget.initialIndexes!.isNotEmpty) {
121+
initValue = _initLocationByIndexes(widget.initialIndexes!);
122+
} else {
123+
_initLocation(widget.initialData??'');
124+
}
125+
119126
_currentTabIndex = _tabListData.length - 1;
120-
_level = _currentTabIndex > 0 ? _currentTabIndex : 0;
121-
if (_currentTabIndex >= 0) {
127+
_level = _currentTabIndex>0?_currentTabIndex:0;
128+
if(_currentTabIndex>=0){
122129
_tabListData = _tabListData.reversed.toList();
123-
_selectTabValue = widget.initialData;
124-
_selectListData = _listData
125-
.where((element) =>
126-
element.parentValue == _tabListData[_currentTabIndex].parentValue)
127-
.toList();
128-
} else {
130+
_selectTabValue = initValue ?? widget.initialData;
129131
_selectListData =
130-
_listData.where((element) => element.level == 0).toList();
132+
_listData.where((element) => element.parentValue == _tabListData[_currentTabIndex].parentValue).toList();
133+
}else{
134+
_selectListData = _listData.where((element) => element.level == 0).toList();
131135
_tabListData.add(MultiCascaderListModel(
132-
labelFun: () => context.resource.cascadeLabel,
136+
labelFun: ()=>context.resource.cascadeLabel,
133137
));
134138
}
135139
}
@@ -190,6 +194,46 @@ class _TDMultiCascaderState extends State<TDMultiCascader>
190194
}
191195
}
192196

197+
/// 根据索引列表初始化选中位置
198+
String? _initLocationByIndexes(List<int> indexes) {
199+
if (indexes.isEmpty) return null;
200+
201+
String? lastValue = _getValueByIndexes(indexes);
202+
203+
if (lastValue != null) {
204+
_initLocation(lastValue);
205+
}
206+
207+
return lastValue;
208+
}
209+
210+
/// 根据索引列表获取对应的值
211+
String? _getValueByIndexes(List<int> indexes) {
212+
if (indexes.isEmpty) return null;
213+
214+
List<dynamic> currentLevel = widget.data;
215+
String? value;
216+
217+
for (int i = 0; i < indexes.length; i++) {
218+
int index = indexes[i];
219+
220+
if (index >= 0 && index < currentLevel.length) {
221+
Map item = currentLevel[index];
222+
value = item['value'];
223+
224+
if (i < indexes.length - 1 && item.containsKey('children') && item['children'] is List && item['children'].isNotEmpty) {
225+
currentLevel = item['children'];
226+
} else {
227+
break;
228+
}
229+
} else {
230+
return null;
231+
}
232+
}
233+
234+
return value;
235+
}
236+
193237
void _listDataSegmenter() {
194238
_listData.sort((a, b) {
195239
if (a.segmentValue == null || b.segmentValue == null) {

0 commit comments

Comments
 (0)