Flutter riverpod 基于事件自动改变状态
Flutter riverpod automatic state change based on event
我是 riverpod 的新手,虽然这些文章对入门很有帮助,但我正在为陈旧的状态而苦苦挣扎。
当用户登录时,我正在设置一些状态。当数据库中的状态细节发生变化时,我希望重建自动发生。虽然我能够从数据库中获取流,但我无法将数据库更改连接到 riverpod 状态。
该模式用于协作。两个用户在独立的手机、平板电脑等上处理应用程序的同一部分
我正在使用来自 firecloudstore 的文档流和集合流。
是否有任何有用的文章或您是如何使用 riverpod 解决此问题的?我是否必须为此花时间学习 BLoC 之类的东西?
你绝对不需要学习 BLoC 来完成你想要的。
你说你正在使用 firebase 流,所以这里有一个当你的数据改变时实时重建的例子。
首先,您的存储库层。
class YourRepository {
YourRepository(this._read);
static final provider = Provider((ref) => YourRepository(ref.read));
final Reader _read;
Stream<YourModel?> streamById(String id) {
final stream = FirebaseFirestore.instance.collection('YourCollection').doc(id).snapshots();
return stream.map((event) => event.exists ? YourModel.fromJson(event.data()!) : null);
}
}
接下来,定义一个 StreamProvider 来读取存储库中定义的流。
final streamYourModelById = StreamProvider.autoDispose.family<YourModel?, String>((ref, id) {
return ref.watch(YourRepository.provider).streamById(id);
});
最后,在数据更改时使用小部件中的 StreamProvider 重新加载。
// Hooks
class YourWidget extends HookWidget {
const YourWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: useProvider(streamYourModelById('YourDataId')).when(
loading: () => const Center(child: CircularProgressIndicator()),
error: (err, stack) => Center(child: Text(err.toString())),
data: (yourData) => Center(child: Text(yourData?.toString() ?? 'Got Null')),
),
);
}
}
// Without Hooks
class YourWidget extends ConsumerWidget {
const YourWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, ScopedReader watch) {
return Scaffold(
body: watch(streamYourModelById('YourDataId')).when(
loading: () => const Center(child: CircularProgressIndicator()),
error: (err, stack) => Center(child: Text(err.toString())),
data: (yourData) => Center(child: Text(yourData?.toString() ?? 'Got Null')),
),
);
}
}
您应该能够应用此模式来完成您需要的任何事情。
我是 riverpod 的新手,虽然这些文章对入门很有帮助,但我正在为陈旧的状态而苦苦挣扎。
当用户登录时,我正在设置一些状态。当数据库中的状态细节发生变化时,我希望重建自动发生。虽然我能够从数据库中获取流,但我无法将数据库更改连接到 riverpod 状态。
该模式用于协作。两个用户在独立的手机、平板电脑等上处理应用程序的同一部分
我正在使用来自 firecloudstore 的文档流和集合流。
是否有任何有用的文章或您是如何使用 riverpod 解决此问题的?我是否必须为此花时间学习 BLoC 之类的东西?
你绝对不需要学习 BLoC 来完成你想要的。
你说你正在使用 firebase 流,所以这里有一个当你的数据改变时实时重建的例子。
首先,您的存储库层。
class YourRepository {
YourRepository(this._read);
static final provider = Provider((ref) => YourRepository(ref.read));
final Reader _read;
Stream<YourModel?> streamById(String id) {
final stream = FirebaseFirestore.instance.collection('YourCollection').doc(id).snapshots();
return stream.map((event) => event.exists ? YourModel.fromJson(event.data()!) : null);
}
}
接下来,定义一个 StreamProvider 来读取存储库中定义的流。
final streamYourModelById = StreamProvider.autoDispose.family<YourModel?, String>((ref, id) {
return ref.watch(YourRepository.provider).streamById(id);
});
最后,在数据更改时使用小部件中的 StreamProvider 重新加载。
// Hooks
class YourWidget extends HookWidget {
const YourWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: useProvider(streamYourModelById('YourDataId')).when(
loading: () => const Center(child: CircularProgressIndicator()),
error: (err, stack) => Center(child: Text(err.toString())),
data: (yourData) => Center(child: Text(yourData?.toString() ?? 'Got Null')),
),
);
}
}
// Without Hooks
class YourWidget extends ConsumerWidget {
const YourWidget({Key? key}) : super(key: key);
@override
Widget build(BuildContext context, ScopedReader watch) {
return Scaffold(
body: watch(streamYourModelById('YourDataId')).when(
loading: () => const Center(child: CircularProgressIndicator()),
error: (err, stack) => Center(child: Text(err.toString())),
data: (yourData) => Center(child: Text(yourData?.toString() ?? 'Got Null')),
),
);
}
}
您应该能够应用此模式来完成您需要的任何事情。