将参数传递给 Flutter Riverpod StreamProvider

时间:2021-01-17 22:56:23

标签: flutter riverpod

我正在尝试将相同的参数传递给 StreamProvider 但我无法让它工作,这段代码工作得很好

 final dataStreamProvider = StreamProvider.autoDispose<DataModel>((ref) {
      return Repository().fetchData(1, 2);
});

Consumer(
      builder: (context, watch, child) {
      AsyncValue leagueInfo = watch(dataStreamProvider);
      return leagueInfo.when(
          data: (data) {
            print(data);
            return Text("Data");
          },
          loading: () => Loader(""),
          error: (err, stack) => Text('Error: $err'),
        );
    },
)

但是当我尝试将一些参数传递给 StreamProvider 时,我收到了对流的无限调用

// This trigger an infinit call to the stream 'Repository().fetchData'

final dataStreamProvider = StreamProvider.autoDispose.family<DataModel, Map<String, dynamic>>((ref, params) {
      return Repository().fetchData(params['id'], params['id2']);
});

Consumer(
      builder: (context, watch, child) {
      AsyncValue leagueInfo = watch(dataStreamProvider({'id': 1, 'id2': 2}));
      return leagueInfo.when(
          data: (data) {
            print(data);
            return Text("Data");
          },
          loading: () => Loader(""),
          error: (err, stack) => Text('Error: $err'),
        );
    },
)

1 个答案:

答案 0 :(得分:2)

用带有 == 覆盖的数据类替换你的地图

class Date {
  final int id1;
  final int id2;
  Date({
    this.id1,
    this.id2,
  });


  @override
  bool operator ==(Object o) {
    if (identical(this, o)) return true;
  
    return o is Date &&
      o.id1 == id1 &&
      o.id2 == id2;
  }

  @override
  int get hashCode => id1.hashCode ^ id2.hashCode;
}


final dataStreamProvider = StreamProvider.autoDispose.family<DataModel, Date>((ref, params) {
      return Repository().fetchData(params.id1, params.id2);
});



Consumer(
      builder: (context, watch, child) {
      AsyncValue leagueInfo = watch(dataStreamProvider(Date(id1: 1,id2: 2)));
      return leagueInfo.when(
          data: (data) {
            print(data);
            return Text("Data");
          },
          loading: () => Loader(""),
          error: (err, stack) => Text('Error: $err'),
        );
    },
)