我有一个应用程序,其中需要在 Feed 屏幕上显示视频上传进度指示器。返回上传进度的代码位于视频客户端类中,该类不在 Feed 屏幕的小部件树中,并且在视频开始上传时 Feed 屏幕甚至没有打开。
我想要做的是使用 Riverpod 在视频客户端类中全局更新上传值,以便在打开提要屏幕时显示上传进度。
问题是视频客户端是一个单独的类,没有任何构建上下文,我正在尝试更新值。我听说 Riverpod 可以在没有构建上下文的情况下设置状态。但是我可以看到更新状态的唯一方法仍然需要上下文。
在 main 函数中,我在此处添加提供程序范围:
void main() {
FlowRouter.setupRouter();
runApp(ProviderScope(child: MyApp()));
}
我有一个上传模型,它扩展了更改通知器以更新值:
class UploadModel extends ChangeNotifier{
UploadModel();
int _bytesTotal = 0;
int _bytesUploaded = 0;
bool _uploadVisible = false;
void setBytesTotal(int value){
_bytesTotal = value;
notifyListeners();
}
int get getBytesTotal => _bytesTotal;
void setBytesUploaded(int value){
_bytesUploaded = value;
notifyListeners();
}
int get getBytesUploaded => _bytesUploaded;
void setUploadVisible(bool value){
_uploadVisible = value;
notifyListeners();
}
bool get getUploadVisible => _uploadVisible;
}
在 Feed 小部件中,我有以下代码来监视和更新上传小部件:
final uploadProvider = riverpod.ChangeNotifierProvider((ref) => UploadModel());
class UploaderProgressWheel extends riverpod.ConsumerWidget {
@override
Widget build(BuildContext context, ScopedReader watch) {
final uploadInfo = watch(uploadProvider);
return Text(uploadInfo.getBytesUploaded.toString());
}
但是当我去更新视频客户端类中的上传值时,我看不到任何不需要上下文的方法,我想我需要再次在视频客户端类中添加提供程序,如下所示:
final uploadProvider = riverpod.ChangeNotifierProvider((ref) => UploadModel());
然后我想从 UploadModel 类中使用 setBytesUploaded() 访问设置值,但我无权访问它,我发现的唯一示例如下所示,需要上下文:
context.read(uploadProvider).state =
谢谢