如何实现一个匿名内部类


#1

在java 实现一个接口最方便的一个方式就是匿名内部类,但是在dart中,完全不知道怎么写,按java的写法是不行的,dart的资料也很少,没有找到匿名内部类的写法,希望有大牛帮帮忙。谢谢!


#2

很可惜,Dart目前是不支持内部类的。Dart初期设计相对保守,语言本身的特性并不丰富,内部类特性Dart团队应该也在考虑添加,感兴趣的话可以看下这个issue: https://github.com/dart-lang/sdk/issues/3755


#3

既然没有,那么dart用什么样的方式来代替这种情况的处理呢?比如我现在是网络请求,需要做一些封装,然后请求成功或者失败就要通知UI页面显示,这个怎么办才行呢?
比如我设计的代码是

abstract class AiiResponseListener {
void onSuccess(dynamic content);
void onFailure(String error);
}
封装的请求
void request(String url, dynamic requestJson, AiiResponseListener aiiResponse) {
// …
int code = 200;
if(code == 200){
String content = “{“status”:“success”, …}”;
aiiResponse.onSuccess(content);
} else {
String error = “网络异常”;
aiiResponse.onFailure(error);
}
}

//ui 界面 发起请求
request(url, json, new AIIResponse(context));

class AIIResponse implements AiiResponseListener {
BuildContext context;
AIIResponse(BuildContext context) {
this.context = context;
}
@override
void onSuccess(jsonData) {
print(jsonData);
//页面显示 数据
}

@override
void onFailure(String error) {
//提示错误
showMessage(context, error);
}

}

然而这样做 AIIResponse 又是另外一个类,跟UI界面交互又有困难,所以觉得很难办,希望大神指点迷津!


#4

从代码看应该是Flutter,你这种实现把业务逻辑跟UI耦合了,你应该使用state/model,业务逻辑只修改状态,状态再传入UI组件。你的场景应该可以把请求封装成模型或service类,然后使用Flutter的FutureBuilder更新UI,具体可以参考:https://flutter.io/cookbook/networking/fetch-data 。此外,关于更高阶的状态管理,建议可以看下flutter_redux, scoped_model等库。


#5

用高级函数来写。。。


#6

像这样子:
typedef void Success<T>(T data, String successMsg);
typedef void Failed(int code, String errorMsg);

abstract class IpAction {
void getIpDetail(String id, Success<IpDetail> onSuccess, Failed onFailed);
}