dart 如果我去掉“const”这个词,为什么提供程序总是处于“加载”状态?

ux6nzvsh  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(100)

我正在使用StreamProviderFamily

`ref.watch(getReceitasRefeicaoProvider(  const ReceitasParams(
                  tipo: 'meat',
                  maxPreco: 10000,
                  minLikes: 0,
                  maxCalorias: 100000,
                  maxtempo: 1000)))
              .when(`

以显示用户的食谱。一开始我使用了上面代码中的"const RecipesParams",一切都运行得很好。但是当我删除"const"

`ref.watch(getReceitasRefeicaoProvider(ReceitasParams(
                  tipo: 'meat',
                  maxPreco: 10000,
                  minLikes: 0,
                  maxCalorias: 100000,
                  maxtempo: 1000)))
              .when(`

StreamProvider系列始终处于加载状态
Controller.dart

final receitaControllerProvider =
    StateNotifierProvider<ReceitaController, bool>((ref) {
  final receitaRepository = ref.watch(receitaRepositoryProvider);
  final storageRepository = ref.watch(storageRepositoryProvider);
  return ReceitaController(
      receitaRepository: receitaRepository,
      ref: ref,
      storageRepository: storageRepository);
});

final getReceitasRefeicaoProvider = StreamProvider.family<List<Receita>, ReceitasParams>((ref, ReceitasParams params) {
  final postController = ref.watch(receitaControllerProvider.notifier);
  return postController.getReceitasRefeicao(params.tipo, params.maxPreco, params.minLikes, params.maxCalorias, params.maxtempo);
});

Stream<List<Receita>> getReceitasRefeicao(
      String tipo, int maxPreco, int minLikes, int maxCalorias, int maxtempo) {
            return _receitaRepository.getReceitasRefeicao(tipo,maxPreco,minLikes,maxCalorias,maxtempo);
      }

repository.dart

Stream<List<Receita>> getReceitasRefeicao(
      String tipo, int maxPreco, int minLikes, int maxCalorias, int maxtempo) {
    return _receitas.where('refeicoes', arrayContains: tipo).snapshots().map(
          (event) => event.docs
              .map((e) => Receita.fromMap(e.data() as Map<String, dynamic>))
              .where((receita) {
            final preco = int.tryParse(receita.preco);
            final calorias = int.tryParse(receita.calorias);
            final tempo = int.tryParse(receita.tempo);
            return preco != null &&
                calorias != null &&
                tempo != null &&
                tempo < maxtempo &&
                preco < maxPreco &&
                receita.likes.length >= minLikes &&
                calorias < maxCalorias;
          }).toList(),
        );
  }

我不明白为什么。

jqjz2hbq

jqjz2hbq1#

如果你删除了const,但没有为ReceitasParams设置正确的==和hashCode,那么它的每个示例都是!=的任何其他示例,并且每次都将获得一个全新的提供程序,即使参数相同。
所以,是的,解决方案是你必须实现==和hashCode,这样相等的东西也是==。

pcww981p

pcww981p2#

经过一段时间的研究,我终于找到了解决办法。要更正此错误,需要为RecipesParams创建一个“数据类”。

相关问题