我陷入了无限循环

问题描述 投票:0回答:1

我无法让我的代码停止循环

class CategoriesScreenCopy extends ConsumerStatefulWidget {
  const CategoriesScreenCopy({super.key});

  @override
  ConsumerState<CategoriesScreenCopy> createState() => _CategoriesScreenState();
}

class _CategoriesScreenState extends ConsumerState<CategoriesScreenCopy> {

  List<Widget> drinkCategories = [];

  Widget highPDrinks = ListView();
  Widget highFDrinks = ListView();
  Widget lowBSDrinks = ListView();

  Widget getHighProteinDrinks() {
    for (final drink in highProteinDrinks) {
      highPDrinks = ListView.builder(
        scrollDirection: Axis.horizontal,
        itemCount: highProteinDrinks.length,
        itemBuilder: (ctx, index) => DrinkItem(
          drink: highProteinDrinks[index],
        ),
      );
    }

    drinkCategories.add(getHighFiberDrinks());

    return highPDrinks;
  }

  Widget getHighFiberDrinks() {
    for (final drink in highFiberDrinks) {
      highFDrinks = ListView.builder(
        scrollDirection: Axis.horizontal,
        itemCount: highFiberDrinks.length,
        itemBuilder: (ctx, index) => DrinkItem(
          drink: highFiberDrinks[index],
        ),
      );
    }

    drinkCategories.add(highFDrinks);

    return highFDrinks;
  }

  @override
  void initState() {
    super.initState();
    getHighProteinDrinks();
    getHighFiberDrinks();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GridView.builder(
        gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
          crossAxisCount: 1,
          childAspectRatio: 3 / 3,
          crossAxisSpacing: 20,
          mainAxisSpacing: 8,
        ),
        //itemCount: drinkCategories.length,
        itemBuilder: (context, index) => CategoryViewer(
          categoryDrinkList: getHighFiberDrinks(),
          categoryDrinkName: 'High-Protein Drinks',
        ),
      ),
    );
  }
}

我只是尝试渲染 2 个 CategoryViewer 实例,因为其中只有 2 个应该位于

drinkCategories
中。
getHighProteinDrinks()
Widget 函数也在列表中添加了 1,并且
getHighFiberDrinks()
应该添加另一个,但由于某种原因,我有无穷无尽的相同 CategoryViewer 和相同的子 ListView 小部件。我知道这应该很简单,但我对 Flutter 很陌生。一些帮助将不胜感激。

flutter dart
1个回答
0
投票

首先,您必须在 GridView.builder 中传递 itemCount 参数,否则 itemBuilder 会无限调用,最终会无休止地滚动屏幕。

从你的问题中我了解到你只需要 GridView 中的两个小部件我已经编辑了你的代码来实现这一点,我没有 highFiberDrinkshighProteinDrinks 的值,所以我创建了一个测试列表来完成代码。检查下面的代码,您可以根据您的观点更改它。

我还注意到你在函数中使用了for_in循环,我认为不应该在那里,因为它只是覆盖highFiberDrinkshighProteinDrinks列表具有相同的值。

class CategoriesScreenCopy extends StatefulWidget {
  const CategoriesScreenCopy({super.key});

  @override
  State<CategoriesScreenCopy> createState() => _CategoriesScreenState();
}

class _CategoriesScreenState extends State<CategoriesScreenCopy> {
  List<Widget> drinkCategories = [];

  Widget highPDrinks = ListView();
  Widget highFDrinks = ListView();
  Widget lowBSDrinks = ListView();

  List<String> highFiberDrinks = [
    "F_Drint_1 ",
    "F_Drint_2 ",
    "F_Drint_3 ",
    "F_Drint_4 ",
  ];
  List<String> highProteinDrinks = [
    "P_Drint_1 ",
    "P_Drint_2 ",
    "P_Drint_3 ",
    "P_Drint_4 ",
  ];

  Widget getHighProteinDrinks() {
    highPDrinks = ListView.builder(
      scrollDirection: Axis.horizontal,
      itemCount: highProteinDrinks.length,
      itemBuilder: (ctx, index) => Text(
        highProteinDrinks[index],
      ),
    );

    drinkCategories.add(highPDrinks);

    return highPDrinks;
  }

  Widget getHighFiberDrinks() {
    highFDrinks = ListView.builder(
      scrollDirection: Axis.horizontal,
      itemCount: highFiberDrinks.length,
      itemBuilder: (ctx, index) => Text(
        highFiberDrinks[index],
      ),
    );

    drinkCategories.add(highFDrinks);

    return highFDrinks;
  }

  @override
  void initState() {
    super.initState();
    getHighProteinDrinks();
    getHighFiberDrinks();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GridView.builder(
          gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
            crossAxisCount: 1,
            childAspectRatio: 3 / 3,
            crossAxisSpacing: 20,
            mainAxisSpacing: 8,
          ),
          itemCount: drinkCategories.length,
          itemBuilder: (context, index) => Container(
                color: index == 0 ? Colors.red : Colors.blue,
                child: drinkCategories[index],
              )),
    );
  }
}

希望这对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.