Vishal Singh
Vishal Singh

Reputation: 67

Riverpod FutureProvider keeps on firiging again and again

I am using Riverpod's FutureProvider with family. The FutureProvider keeps on running again and again. It shows the loading dialog only. Also the hot reload stops working. FutureProvider is working fine without family. Please help in finding what's wrong.

enter image description here

final ephemerisProvider =
    Provider((ref) => ApiService("https://localhost"));

final ephemerisFutureProvider = FutureProvider.family
    .autoDispose<EpheModel, Map<String, dynamic>>((ref, data) async {
  var response = await ref.read(ephemerisProvider).getData(data);
  print(EpheModel.fromJSON(response));
  return EpheModel.fromJSON(response);
});

class Kundlis extends ConsumerWidget {
  static const routeName = "/kundlis";
  @override
  Widget build(BuildContext context, ScopedReader watch) {
    final AsyncValue<EpheModel> kundlis = watch(ephemerisFutureProvider({}));
    return Scaffold(
        appBar: AppBar(
          title: Text("Kundlis"),
        ),
        drawer: AppDrawer(),
        body: kundlis.when(
            data: (kundli) => Center(child: Text(kundli.toString())),
            loading: () => ProgressDialog(message: "Fetching Details..."),
            error: (message, st) =>
                CustomSnackBar.buildErrorSnackbar(context, '$message')));
  }
}

class ApiService {
  final String url;
  ApiService(this.url);
  Future<Map<String, dynamic>> getData(Map<String, dynamic> data) async {
    try {
      http.Response response = await http.post(url + "/ephe",
          headers: <String, String>{'Content-Type': 'application/json'},
          body: jsonEncode(data));
      if (response.statusCode == 200) {
        return data;
      } else {
        throw Exception("Error Fetching Details");
      }
    } on SocketException {
      throw Exception("No Internet Connection");
    } on HttpException {
      throw Exception("Error Fetching Details");
    }
  }
}

Upvotes: 4

Views: 2126

Answers (2)

Funyinoluwa Kashimawo
Funyinoluwa Kashimawo

Reputation: 534

I was able to resolve this by making the param provided to provider.family to extend Equatable . It worked fine after that

Upvotes: 1

Randal Schwartz
Randal Schwartz

Reputation: 44220

{} != {}. Because of .family, you are creating a completely new provider every time you call watch(ephemerisFutureProvider({})). To select a previously-built provider via family, you must pass an identical value. And {} is never identical to {}, guaranteed. :)

Upvotes: 15

Related Questions