Flutter 颤振如何知道扩展瓦片列表的深度?

Flutter 颤振如何知道扩展瓦片列表的深度?,flutter,recursion,Flutter,Recursion,我正在使用这个示例代码,它运行良好。但我还不知道递归扩展“树”的级别 函数_buildTiles()是递归的,我想在函数参数列表中添加一个“level”整数参数,但如果这样做,那么行“root.children.map(_buildTiles.toList()”将导致它不再编译 import 'package:flutter/material.dart'; class ExpansionTileExample extends StatelessWidget { const Expansio

我正在使用这个示例代码,它运行良好。但我还不知道递归扩展“树”的级别

函数_buildTiles()是递归的,我想在函数参数列表中添加一个“level”整数参数,但如果这样做,那么行“root.children.map(_buildTiles.toList()”将导致它不再编译

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);
   }

*/