【发布时间】:2019-09-28 12:13:15
【问题描述】:
来自我的网络服务器上的这个链接
http://instamaker.ir/api/v1/getPersons
我正在尝试从该结果中获取结果并打印 avatar,不幸的是,我使用 rxDart 和 Bloc 的实现没有从该响应中得到结果,我没有收到任何错误
服务器响应这个简化的结果:
{
"active": 1,
"name": "my name",
"email": " 3 ",
"loginType": " 3 ",
"mobile_number": " 3 ",
...
"api_token": "1yK3PvAsBA6r",
"created_at": "2019-02-12 19:06:34",
"updated_at": "2019-02-12 19:06:34"
}
main.dart 文件:(点击按钮从服务器获取结果)
StreamBuilder(
stream: bloc.login,
builder: (context,
AsyncSnapshot<UserInfo>
snapshot) {
if (snapshot.hasData) {
parseResponse(snapshot);
}
},
);
void parseResponse(AsyncSnapshot<UserInfo> snapshot) {
debugPrint(snapshot.data.avatar);
}
LoginBlock类:
class LoginBlock{
final _repository = Repository();
final _login_fetcher = PublishSubject<UserInfo>();
Observable<UserInfo> get login=>_login_fetcher.stream;
fetchLogin() async{
UserInfo userInfo = await _repository.userInfo();
_login_fetcher.sink.add(userInfo);
}
dispose(){
_login_fetcher.close();
}
}
final bloc = LoginBlock();
Repository类:
class Repository {
final userInformation = InstagramApiProviders();
Future<UserInfo> userInfo() => userInformation.checkUserLogin();
}
我的模特:
class UserInfo {
int _active;
String _name;
...
UserInfo.fromJsonMap(Map<String, dynamic> map)
: _active = map["active"],
_name = map["name"],
...
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['active'] = _active;
data['name'] = _name;
...
return data;
}
//GETTERS
}
BaseUrl类:
class BaseUrl {
static const url = 'http://instamaker.ir';
}
然后InstagramApiProviders类:
class InstagramApiProviders {
Client client = Client();
Future<UserInfo> checkUserLogin() async {
final response = await client.get(BaseUrl.url+'/api/v1/getPersons');
print("entered "+BaseUrl.url+'/api/v1/getPersons');
if (response.statusCode == 200) {
return UserInfo.fromJsonMap(json.decode(response.body));
} else
throw Exception('Failed to load');
}
}
【问题讨论】:
-
当你说“不要从这个响应中得到结果并且我没有得到任何错误”是因为你无法从服务器获取数据或者是因为你看不到任何变化在你的用户界面中?
-
@Marcos Boaventura 是的,对于简单的显示结果,我想使用此代码
void parseResponse(AsyncSnapshot<UserInfo> snapshot) { debugPrint(snapshot.data.avatar); } -
嗯,你需要把你的 StreamBuilder 小部件放在一个小部件树中,以便调用 StreamBuilder **builder 方法我认为这就是你看不到任何结果的原因。我在这里做了一些测试,我得到了它的工作。