5

我有一个应用程序,其中需要在 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 = 

谢谢

4

1 回答 1

2
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

And now when you want to upload a video or do something specific with your VideoClient you call this provider from anywhere in your app

RaisedButton(
  onTap: () {
    context.read(VideoProvider).upload(); //or whatever method you use to initilize an action
  }
);
于 2020-12-10T18:00:59.797 回答