flutter 使用Riverpod状态提供程序控制对象中的更改

q8l4jmvw  于 2023-10-22  发布在  Flutter
关注(0)|答案(1)|浏览(144)

我正在学习Riverpod,所以我正在尝试不同的东西,看看它是如何工作的。假设我的应用程序中有以下类:

class User {
  String _name = "";
  String _email = "";

  String get email => _email;

  String get name => _name;

  set email(String value) {
    _email = value;
  }

  set name(String name) {
    _name = name;
  }
}

因此,我创建了一个StateProvider来控制User对象中的更改:

final userProvider = StateProvider<User>((ref) {
  return User();
});

它是这样访问的:

final user = ref.watch(userProvider);
...
Text('Value: ${user.name}'),

但是,当我更改提供程序的状态时,它不会重建我的UI。

ref.read(userProvider.notifier).state.name = 'John Doe'

我错过了什么?

eni9jsuy

eni9jsuy1#

如果您仔细注意,您正在创建User的StateProvider。因此,更改单个示例字段并不意味着它是不同的示例(新用户),这就是更改/更新字段不会刷新UI的原因。需要传入新示例来更新UI。
你可以做

final currentData = ref.read(userProvider);
ref.read(userProvider.notifier).state =
    User(name: 'new name', email: currentData.email);

但我更喜欢copyWith方法

final currentData = ref.read(userProvider);
 ref.read(userProvider.notifier).state =
     currentData.copyWith(name: 'new name');

或者使用更新

ref
    .read(userProvider.notifier)
    .update((state) => state.copyWith(name: 'new name'));

还有模特班

class User {
  const User({
    this.name = '',
    this.email = '',
  });

  final String name;
  final String email;

  User copyWith({
    String? name,
    String? email,
  }) {
    return User(
      name: name ?? this.name,
      email: email ?? this.email,
    );
  }
}

相关问题