如何在Flutter中返回用户流?

3
我在flutter中使用StreamBuilder widget时遇到了问题。我试图访问一个存储令牌的自定义类。
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  .................. ;
  }

流是数据的一种流动形式。你似乎没有任何流动。你可以使用Stream.value从你的一个值创建一个流,但如果你的数据本身不是流,那又有什么意义呢?你想让你的流代表什么? - nvoigt
@nvoigt 我在包装类中没有得到任何值。我该怎么办?code class Wrapper extends StatelessWidget { @override Widget build(BuildContext context) { final user = Provider.of<User>(context); print(user); if (user == null) { return Authenticate(); } else { return Home(); } } } code - James Maddinson
2个回答

3
你可以使用流控制器:
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;
  }

请注意,此方法是一个简单的例子,有一些缺陷,您应该阅读文档以了解更多信息。
如果您将其用于所描述的目的,则可能需要研究模式及其在中的实现。手动完成用户可能会更容易,但一旦您拥有多个这些流时,您可能需要更有结构化的方法。

我在包装类中没有得到任何值,我该怎么办?@nvoigt class Wrapper extends StatelessWidget { @override Widget build(BuildContext context) { final user = Provider.of<User>(context); print(user); if (user == null) { return Authenticate(); } else { return Home(); } } } - James Maddinson

0
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接