Home > Net >  How do I update Flutter's Riverpod values from business logic?
How do I update Flutter's Riverpod values from business logic?

Time:10-25

When using Flutter and Riverpod, how do I update its values from my business logic?

I understand that I can get and set values from the UI side.

class XxxNotifier extends StateNotifier<String> {
  XxxNotifier() : super("");
}

final xxxProvider = StateNotifierProvider<XxxNotifier, int>((ref) {
  return XxxNotifier();
});

class MyApp extends HookConsumerWidget {
  @override
  Widget build(BuildContext context, WidgetRef ref) {
    // getValue
    final String value = ref.watch(xxxProvider);

    // setValue
    context.read(xxxProvider).state = "val";

    return Container();
  }
}

This method requires a context or ref.

How do I get or set these states from the business logic side?

Passing a context or ref from the UI side to the business logic side might do that, but I saw no point in separating the UI and business logic. Perhaps another method exists.

Perhaps I am mistaken about something. You can point it out to me.

CodePudding user response:

You can pass ref in your XxxNotifier class:

class XxxNotifier extends StateNotifier<String> {
  XxxNotifier(this._ref) : super("");

  final Ref _ref;

  void setNewState() {
    state = 'to setting';
    // use `_ref.read` to read state other provider
  }
}

final xxxProvider = StateNotifierProvider<XxxNotifier, int>((ref) {
  return XxxNotifier(ref);
});

// or using tear-off
final xxxProvider = StateNotifierProvider<XxxNotifier, int>(XxxNotifier.new);

CodePudding user response:

You can create methods in your XxxNotifier class to modify the state of your provider.

For example, your notifier class can look like this.

class TodosNotifier extends StateNotifier <List<Todo>> {
  TodosNotifier(): super([]);

  void addTodo(Todo todo) {
    state = [...state, todo];
  }

}

You can then read the provider in a callback.

ref.read(xxxProvider.notifier).addTodo(todo);
  • Related