问题描述
我遇到了麻烦,将Stream返回到Flutter中的StreamBuilder小部件。我正在尝试访问存储令牌的自定义类。
class User {
String token;
User({this.token});
}
===============================
class AuthService {
String url = 'https://reqres.in/api/login';
String token = '';
// {
// "email": "eve.holt@reqres.in",// "password": "cityslicka"
// }
Map data;
Future signIn(String email,String password) async {
final response =
await post(url,body: {'email': email,'password': password});
data = jsonDecode(response.body);
print(data['token']);
token = data['token'];
_userFromDatabaseUser(data);
return data;
}
//create user obj based on the database user
User _userFromDatabaseUser(Map user) {
return user != null ? User(token: user['token']) : null;
}
//user stream for provider
Stream<User> get user {
return .................. ;
}
解决方法
You can use
Stream<User> get user async*{
yield .................. ;
}
要返回流对象时可以使用yield关键字。
2nd way you can use a stream controller. You can add value in controller and
listen wherever you want to listen in your app there is no need to return stream
,
您可以使用流控制器:
class AuthService {
final String url = 'https://reqres.in/api/login';
final controller = StreamController<User>();
Future<User> signIn(String email,String password) async {
final response = await post(url,body: {'email': email,'password': password});
final data = jsonDecode(response.body);
final user = _userFromDatabaseUser(data);
controller.add(user);
return user;
}
//create user obj based on the database user
User _userFromDatabaseUser(Map user) {
return user != null ? User(token: user['token']) : null;
}
//user stream for provider
Stream<User> get user {
return controller.stream;
}
请注意,这种方法是一个简单的示例,存在一些缺陷,您应该仔细阅读in the documentation。
如果将其用于描述目的,则可能需要研究bloc模式,并将其实现为flutter-bloc。用这种方式手动处理用户似乎比较容易,但是一旦达到拥有多个此类流的地步,就可能需要一种更有条理的方法。