1.生命周期

当关联的Page 进行initState 或者 dispose , BaseProvider对应的方法也会同步进行

class IndexProvider extends BaseProvider {

  @override
  Future? get dataFuture => null;

  @override
  void initState() {
    super.initState();
    // 同步 State 的 initState
  }

  @override
  void dispose() {
    super.dispose();
    // 同步 State 的 dispose
  }
}

2.触发更新

当值发生改变时,我们需要调用update()触发更新,并在视图侧我们需要使用dataSelector或者dataBuilder进行包裹

class IndexProvider extends BaseProvider {
  int count = 0;

  @override
  Future? get dataFuture => null;

  void onAdd() {
    count += 1;
    update();
  }
}

3.监听全局变量更新

监听全局变量,我们可以使用RProviderListener 然后实现listener

class IndexProvider extends BaseProvider with RProviderListener {
 // ... 
  @override
  void listener(Map<String, dynamic>? oldMap, Map<String, dynamic>? newMap) {
   // oldMap  更新前
   // newMap  更新后
  }
}

4.请求网络

当我们需要请求网络时,可以使用fetch 方法

示例代码:

class IndexProvider extends BaseProvider {
 // ... 
  void getUserInfo() {
    fetch(BaseConfig.httpService.get('/userInfo', null),
        onSuccess: (result) {
        //获取成功,result 为得到的结果
        },
        onError: (int? statusCode, Object? error, StackTrace? stackTrace) {
        //获取失败, statusCode 状态码, error错误信息, stackTrace栈
     });
  }
}

1.处理异常与错误

正常请求成功会回调onSuccess方法,如果请求过程中出现错误会回调onError方法,也可以自动处理这些错误而只处理onSuccess,支持三种模式

  • AutoHandler.Page 当出现错误时,通过页面处理错误,也就是关联的Widget显示错误
  • AutoHandler.Toast 当出现错误时,使用Toast显示错误信息
  • AutoHandler.Dialog 当出现错误时,使用Dialog 显示信息

示例代码:

class IndexProvider extends BaseProvider {
 // ... 
  void getUserInfo() {
    fetch(BaseConfig.httpService.get('/userInfo', null),
        onSuccess: (result) {
        //获取成功,result 为得到的结果
        },
        autoHandler: AutoHandler.Toast
     );
  }
}

2.添加加载loading弹框

在加载网络的过程中,如果想让用户感知正在请求网络,就需要加载loading 的弹框,我们在请求网络代码中只需多加一句即可

示例代码:

class IndexProvider extends BaseProvider {
 // ... 
  void getUserInfo() {
    fetch(BaseConfig.httpService.get('/userInfo', null),
        onSuccess: (result) {
        //获取成功,result 为得到的结果
        },
        autoHandler: AutoHandler.Toast,
        loadingTip: '加载中...'
     );
  }
}

请求网络完成,即失败或者成功,都会自动取消loading弹框,如果不想取消弹框,我们可以设置参isAutoCancelLoading=false

示例代码:

class IndexProvider extends BaseProvider {
 // ... 
  void getUserInfo() async{
    await fetch(BaseConfig.httpService.get('/userInfo', null),
        onSuccess: (result) {
        //获取成功,result 为得到的结果
        },
        autoHandler: AutoHandler.Toast,
        loadingTip: '加载中...',
        isAutoCancelLoading: false
     );
    //处理其它请求
  }
}

3.处理请求完最后操作

网络请求基本上介绍完了, 还剩一个onFinally , 这里无论是请求失败或者成功,总会在后续调用,也可以在await fetch 之后执行所需代码

示例代码:

class IndexProvider extends BaseProvider {
 // ... 
  void getUserInfo() async{
    await fetch(BaseConfig.httpService.get('/userInfo', null),
        onSuccess: (result) {
        //获取成功,result 为得到的结果
        },
        autoHandler: AutoHandler.Toast,
        loadingTip: '加载中...',
        isAutoCancelLoading: false,
        onFinally: (){
          //1.执行完后处理
        }
     );
    //2.处理其它请求
  }
}

评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片