如何获取通常使用 widget.[etc] 接收的数据?

How do I get data that is usually received with widget.[etc]?

我正在尝试使用地图中的数据创建一个 ExpansionPanel。我的数据是在一个单独的函数中从 API 创建的,并使用 this.branchData 传递数据。我在下面附上了我的代码:

class RunList extends StatefulWidget {

// Creates a list of packages.
final Map branchData;

// Defines what needs to be passed into the class. Needs the branchNames list.
RunList(this.branchData, {Key? key}) : super(key: key);
@override

// Creates mutable state for that widget at a given location in the tree.
// Returns _ProjectDropdownState() which extends the State.

State<RunList> createState() => _RunListState();
}

但是,我试图在一个名为 generateItems 的单独函数中访问 branchData,但我收到错误“未定义的名称 'branchData'”。我可以使用 widget.branchData 访问 branchData,但是,我不能在 generateItems 中使用它。有什么方法可以让代码中其他地方的 branchData 可用于 generateItems?我在下面附上了 generateItems:

List<Item> generateItems(int numberOfItems) {

  List<Item> runData = [];

  // Create Item
  var run = new Item (
    headerValue: branchData["refs/heads/main"][branchData["branchRuns"]["refs/heads/main"][0]].commitTitle,
    expandedValue: 'Nothing to see yet...',
  );
  runData.add(run);

  return runData;
}

因此您在 class RunList.

中有名为 branchData 的数据

案例 1:如果您在 _RunListState() 的构建方法中调用 generateItems 函数:

在调用函数 generateItems() 时使用 widget.branchData 从小部件传递数据(这是来自父小部件的数据实例,此处为 RunList)。现在您可以在异步函数的情况下等待结果,或者继续您的程序。



案例 2:从另一个小部件调用 generateItems 函数:

我的方法是使用 provider implementation。当您在创建 RunList class 时获得对 branchData 的访问权限时,将值发送给提供者,以便您可以从小部件树中的任何位置访问它。 YT 上有多个针对此实现的教程。

您可以使用 List.generate 创建小部件列表,而不是使用外部函数来创建它们 例如:

List.generate(branchData["refs/heads/main"][branchData["branchRuns"]]["refs/heads/main"].length, (index) { 
   return Item (
    headerValue: branchData["refs/heads/main"][branchData["branchRuns"]]["refs/heads/main"][index].commitTitle,
    expandedValue: 'Nothing to see yet...',
  );
});