Flutter 颤振如何知道扩展瓦片列表的深度?
我正在使用这个示例代码,它运行良好。但我还不知道递归扩展“树”的级别 函数_buildTiles()是递归的,我想在函数参数列表中添加一个“level”整数参数,但如果这样做,那么行“root.children.map(_buildTiles.toList()”将导致它不再编译Flutter 颤振如何知道扩展瓦片列表的深度?,flutter,recursion,Flutter,Recursion,我正在使用这个示例代码,它运行良好。但我还不知道递归扩展“树”的级别 函数_buildTiles()是递归的,我想在函数参数列表中添加一个“level”整数参数,但如果这样做,那么行“root.children.map(_buildTiles.toList()”将导致它不再编译 import 'package:flutter/material.dart'; class ExpansionTileExample extends StatelessWidget { const Expansio
import 'package:flutter/material.dart';
class ExpansionTileExample extends StatelessWidget {
const ExpansionTileExample({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ListView.builder(
itemBuilder: (BuildContext context, int index) => EntryItem(data[index]),
itemCount: data.length,
);
}
}
// One entry in the multilevel list displayed by this app.
class Entry {
const Entry(this.title, [this.children = const <Entry>[]]);
final String title;
final List<Entry> children;
}
// Data to display.
const List<Entry> data = <Entry>[
Entry(
'Chapter A',
<Entry>[
Entry(
'Section A0',
<Entry>[
Entry('Item A0.1'),
Entry('Item A0.2'),
],
),
Entry('Section A1'),
Entry('Section A2'),
],
),
Entry(
'Chapter B',
<Entry>[
Entry('Section B0'),
Entry('Section B1'),
],
),
];
// Displays one Entry. If the entry has children then it's displayed
// with an ExpansionTile.
class EntryItem extends StatelessWidget {
const EntryItem(this.entry);
final Entry entry;
Widget _buildTiles(Entry root) {
if (root.children.isEmpty) return ListTile(title: Text(root.title));
return ExpansionTile(
key: PageStorageKey<Entry>(root),
title: Text(root.title),
children: root.children.map(_buildTiles).toList(), // <<---- how to add a parameter here to _buildTiles ??
);
}
@override
Widget build(BuildContext context) {
return _buildTiles(entry);
}
}
导入“包装:颤振/材料.省道”;
类ExpansionTileExample扩展了无状态小部件{
const ExpansionTileExample({Key}):super(Key:Key);
@凌驾
小部件构建(构建上下文){
返回ListView.builder(
itemBuilder:(BuildContext上下文,int-index)=>EntryItem(数据[index]),
itemCount:data.length,
);
}
}
//此应用程序显示的多级列表中的一个条目。
班级报名{
常量条目(this.title[this.children=const[]);
最后的字符串标题;
最后儿童名单;
}
//要显示的数据。
常量列表数据=[
入口(
“A章”,
[
入口(
“第A0节”,
[
条目(“第A0.1项”),
条目(“第A0.2项”),
],
),
条目(“第A1节”),
条目(“第A2节”),
],
),
入口(
“B章”,
[
条目(“第B0节”),
条目(“B1节”),
],
),
];
//显示一个条目。如果条目有子条目,则显示该条目
//使用扩展文件。
类EntryItem扩展了无状态小部件{
const EntryItem(此项);
最终入围;
Widget\u buildTiles(条目根){
if(root.children.isEmpty)返回ListTile(标题:Text(root.title));
返回扩展文件(
密钥:PageStorageKey(根),
标题:文本(root.title),
children:root.children.map(_buildTiles.toList(),//我们可以向_buildTiles
方法添加另一个参数,这将实现以下目的:
Widget _buildTiles(Entry root, {int level = 0}) {
if (root.children.isEmpty) return ListTile(title: Text(root.title));
return ExpansionTile(
key: PageStorageKey<Entry>(root),
title: Text(root.title), // do something with level
children: root.children.map(
(child) => _buildTiles(child, level: level+1)
).toList(),
);
}
我们可以用箭头名称缩写:
(child) => _buildTiles(child, level: level + 1)
/* is equal to :
function (child) {
return _buildTiles(child, level: level + 1);
}
*/
太好了!非常感谢。虽然我知道DART,但我想这仍然让我感到困惑。不知道从哪里可以了解更多有关此语法的信息:“(child)=>\u buildTiles(child,level:level+1)”很乐意帮忙!我在回答中添加了更多的说明
(child) => _buildTiles(child, level: level + 1)
/* is equal to :
function (child) {
return _buildTiles(child, level: level + 1);
}
*/