gpt4 book ai didi

Flutter Riverpod 在没有上下文的情况下设置值

转载 作者:行者123 更新时间:2023-12-04 15:10:54 26 4
gpt4 key购买 nike

我有一个应用程序,需要在提要屏幕上显示视频上传进度指示器。返回上传进度的代码位于视频客户端类中,该类不在 Feed 屏幕的小部件树中,并且在视频开始上传时,Feed 屏幕甚至没有打开。
我想要做的是使用 Riverpod 在视频客户端类中全局更新上传值,以便在打开提要屏幕时显示上传进度。
问题是 Video Client 是一个单独的类,没有任何构建上下文,我正在尝试更新该值。我听说 Riverpod 可以在没有构建上下文的情况下设置状态。但是我可以看到更新状态的唯一方法仍然需要上下文。
在主函数中,我在这里添加了提供者作用域:

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 Widget 中,我有以下代码来监视和更新上传小部件:
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 = 
谢谢

最佳答案

class VideoClient { //Example class
final Reader read; //so you can read other providers inside this
int _i = 0; //just for example

VideoClient(this.read);

void exampleMethod(){
read(uploadProvider).setBytesUploaded(_i++);
// each time this method is called a new int is sent to notify the uploadModel
}

//.... your methods
}

final VideoProvider = Provider((ref) => VideoClient(ref.read)); // to have a single instance of your VideoClient across all your app
现在,当您想上传视频或使用 VideoClient 执行特定操作时,您可以从应用程序的任何位置调用此提供程序
RaisedButton(
onTap: () {
context.read(VideoProvider).upload(); //or whatever method you use to initilize an action
}
);

关于Flutter Riverpod 在没有上下文的情况下设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65217768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com