怀疑无限循环使用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 中删除可以修复资源消耗这一事实之外,我不知道任何关于可能导致此问题的技术细节。
我会把它留在这里,以防其他人遇到这个问题,它可能会有所帮助。或者万一其他人可以更好地解释资源耗尽的原因。
我绞尽脑汁寻找我的错误,但我找不到它。寻求帮助。
我在这里使用 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 中删除可以修复资源消耗这一事实之外,我不知道任何关于可能导致此问题的技术细节。
我会把它留在这里,以防其他人遇到这个问题,它可能会有所帮助。或者万一其他人可以更好地解释资源耗尽的原因。