代码之家  ›  专栏  ›  技术社区  ›  aWebDeveloper

将错误传递给小部件的正确方法是什么

  •  0
  • aWebDeveloper  · 技术社区  · 4 年前

    将异常/故障从服务或其他部分传递到小部件的正确方法是什么。

    我想从中传递错误代码 登记 onSignIn公司

    1. 再次从寄存器抛出异常并在onSignIn中捕获它。

    文件A

      void onSignIn() async {
        dynamic result = await _auth.register();
    
        if (result.runtimeType == String) {
          print(result);
        }
      }
    

      Future register() async {
        try {
          AuthResult result = await _auth.createUser();
    
          return _user(result.user);
        } catch (e) {
          return e.code;
        }
      }
    
    0 回复  |  直到 4 年前
        1
  •  0
  •   danypata    4 年前

    对于错误处理,我通常使用包装器对象来帮助我更好地处理错误,甚至“加载”。这是一个来自Google的Android示例的模式,我已经成功地在flutter上使用了它。所以基本上你要创建一个泛型类,在我的例子中我称之为“Response”,它的结构是:

    class Response<T> {
      final ApiError error;
      final T data;
      final ResponseType type;
    
      Response({
        this.error,
        this.data,
        this.type,
      });
    
      bool get isOk {
        return type == ResponseType.ok;
      }
    
      bool get isLoading {
        return type == ResponseType.loading;
      }
    
      bool get hasError {
        return type == ResponseType.error;
      }
    
      factory Response.loading() {
        return Response<T>(type: ResponseType.loading);
      }
    
      factory Response.ok(T data) {
        return Response<T>(type: ResponseType.ok, data: data);
      }
    
      factory Response.empty() {
        return Response<T>.ok(null);
      }
    
      factory Response.error(ApiError data) {
        return Response<T>(type: ResponseType.error, error: data);
      }
    }
    
    enum ResponseType { loading, error, ok }
    

    ApiError 是我处理特定项目错误的自定义实现,可以用泛型 Error

    当您使用 Streams ,因为它不会在出现错误时关闭流,所以您可以通过使用 loading 它将正确处理成功/错误。

    这种方法还允许您向UI发送一个定义更明确的错误,比如说您需要错误代码、错误消息,或者您可以获得一个输入字段名,在其中显示错误。

    虽然,在你的情况下,这可能有点过分,我还是会这样使用它:

    Future<Response<AuthResult>> register() async {
       try {
             AuthResult result = await _auth.createUser();
             return Response.ok(_user(result.user));
          } catch (e) {
              return Response.error(e);
            }
    }
    
    
     void onSignIn() async {
        Response<AuthResult> result = await _auth.register();
    
        if (result.isOk) {
           //TODO: all good let's use data with  result.data
        }
       else if (result.isLoading) {
          // TOOD: well...show a loading indicator
       }
       else {
          //TODO: we got error handle it using result.error
       }
    
      }
    
        2
  •  0
  •   Payam Asefi    4 年前

    here 例如)。同时使用 dynamic final 关键字。因此,首选的方法是:

     Future<AuthResult> register() async {
          AuthResult result = await _auth.createUser();
          return _user(result.user);
      }
    

    然后:

      void onSignIn() async {
    
       try{ 
          final result = await _auth.register();
          print(result);
       } on Exception catch(ex){
          // do something with error
       }
    
      }
    
        3
  •  0
  •   Preet Shah    4 年前

    class Auth with ChangeNotifier{
      AuthResult _authResult;
      AuthResult get authResult => _authResult;
    }
    
    enum AuthResult{
      Successful,
      Error,
      OTPError,
    }
    

    那我就用 provider