怀疑无限循环使用Riverpod & PopupMenuButton

Suspicion of infinite loop using Riverpod & PopupMenuButton

我绞尽脑汁寻找我的错误,但我找不到它。寻求帮助。

我在这里使用 Riverpod 进行依赖注入。一旦我导航到带有 PopupMenuButton 的屏幕,就会出现某种无限循环 运行。这个问题与我的菜单按钮设计有关,因为如果我删除它,一切都很好。有了按钮,我的 CPU 飞涨,没有,这是完全正常的。

我试过在各处插入 print() 语句来寻找重复代码,但我不知道哪里出了问题...

谁能看到这里发生了什么?

服务Class

class AppStateService extends ChangeNotifier {
List<String> saleSources = [];
late String? selectedSaleSource;

Future<void> addSaleSource(String salesPerson) async {
    Box<String> salesSourcesBox = await Hive.openBox<String>(kBoxSaleSource + '_' + authorizedLocalUser!.userID);
    await salesSourcesBox.add(salesPerson);
    saleSources = salesSourcesBox.values.toList();
    print('1');
    notifyListeners();
  }

  Future<void> saleSourceLogic() async {
    Box<String> salesSourcesBox = await Hive.openBox<String>(kBoxSaleSource + '_' + authorizedLocalUser!.userID);
    if (salesSourcesBox.values.toList().isEmpty) await salesSourcesBox.add('Add source');
    if (salesSourcesBox.values.contains('Add source') && salesSourcesBox.values.toList().length > 1) await salesSourcesBox.deleteAt(0);
    saleSources = salesSourcesBox.values.toList();
    print('2');
    notifyListeners();
  }

  Future<void> getSaleSources() async {
    Box<String> salesSourcesBox = await Hive.openBox<String>(kBoxSaleSource + '_' + authorizedLocalUser!.userID);
    saleSources = salesSourcesBox.values.toList();
    print('3');
    notifyListeners();
  }

  void setSaleSource(String source) {
    print('4');
    selectedSaleSource = source;
    notifyListeners();
  }
}

小部件

class SalesSourcePulldownMenuWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    context.read(appState).saleSourceLogic();
    context.read(appState).getSaleSources();
    List<String> listItems = context.read(appState).saleSources;
    late List<PopupMenuItem<String>> menuItems;

    menuItems = listItems
        .map((String value) => PopupMenuItem<String>(
              value: value,
              child: Text(value),
            ))
        .toList();

    return PopupMenuButton<String>(
        itemBuilder: (BuildContext contect) => menuItems,
        onSelected: (String newValue) {
          context.read(appState).setSaleSource(newValue);
        });
  }
}

屏幕片段

...

TextField(
                    controller: salesPerson,
                    keyboardType: TextInputType.text,
                    textCapitalization: TextCapitalization.words,
                    autocorrect: false,
                    decoration: InputDecoration(
                      border: OutlineInputBorder(borderSide: BorderSide(color: Colors.black)),
                      labelText: 'Name',
                      suffixIcon: SalesSourcePulldownMenuWidget(),
                    ),
                  ),

...

我刚刚发现类似循环问题的原因是我的文本字段中的 PopupMenuButton 作为后缀图标。将需要在 textField 之外重新设计。

除了将其从 textField 中删除可以修复资源消耗这一事实之外,我不知道任何关于可能导致此问题的技术细节。

我会把它留在这里,以防其他人遇到这个问题,它可能会有所帮助。或者万一其他人可以更好地解释资源耗尽的原因。