Skip to content

StreamProvider.autoDispose : disposed and re run when reference in futureProvider #243

Closed
@muhajirdev

Description

I am opening this issue based on conversation on #193

final testProvider = StreamProvider.autoDispose((ref) async* {
  ref.onDispose(() {
    print('testProvider disposed');
  });

  yield '1';
  yield '2';
  yield '3';
  yield '4';
});

final someFutureProvider = FutureProvider((ref) async {
  print('future is called');
  return 'something';
});

final test2Provider = FutureProvider.autoDispose((ref) async {
  final somefuture = await ref.watch(someFutureProvider.future);
  print('somefuture is $somefuture');
  final a = await ref.watch(testProvider.last);
  print('a is $a');

  return 'c';
});

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(body: Center(
      child: Consumer(
        builder: (context, watch, child) {
          final u = watch(test2Provider);
          return u.when(
              data: (a) => Text(
                    "anything",
                    style: TextStyle(color: Colors.white),
                  ),
              loading: () => Text(
                    'a',
                    style: TextStyle(color: Colors.white),
                  ),
              error: (e, s) => Text(
                    'b',
                    style: TextStyle(color: Colors.white),
                  ));
        },
      ),
    ));


  }}

try to switch

 final somefuture = await ref.watch(someFutureProvider.future);
  print('somefuture is $somefuture');
  final a = await ref.watch(testProvider.last);
  print('a is $a');

with

final a = await ref.watch(testProvider.last);
print('a is $a');
final somefuture = await ref.watch(someFutureProvider.future);
print('somefuture is $somefuture');

what I found is, if I watch futureProvider first, then I'l' got infinite log like this

flutter: testProvider disposed
flutter: somefuture is something
flutter: a is 1
flutter: testProvider disposed
flutter: somefuture is something
flutter: a is 1
flutter: testProvider disposed
flutter: somefuture is something
flutter: a is 1
flutter: testProvider disposed
flutter: somefuture is something
flutter: a is 1
flutter: testProvider disposed
flutter: somefuture is something
flutter: a is 1
flutter: testProvider disposed
flutter: somefuture is something
flutter: a is 1
flutter: testProvider disposed
flutter: somefuture is something
flutter: a is 1
flutter: testProvider disposed
flutter: somefuture is something
flutter: a is 1
flutter: testProvider disposed
flutter: somefuture is something
flutter: a is 1
flutter: testProvider disposed
flutter: somefuture is something
flutter: a is 1
flutter: testProvider disposed

But if I switch the order, it will be okay

here's the log if I watch StreamProvider first

flutter: a is 1
flutter: future is called
flutter: somefuture is something
flutter: a is 4
flutter: somefuture is something

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions