【问题标题】:Flutter - StreamBuilder - Api - Page refreshFlutter - StreamBuilder - Api - 页面刷新
【发布时间】:2020-06-12 07:43:00
【问题描述】:

我的 Widget 构建中有一个 StreamBuilder:

StreamBuilder(
  stream: stream.asStream(),
  builder: (BuildContext context, AsyncSnapshot snapshot) {
...

流在 void initState 中定义。 fetchPost() 从 Api 调用信息:

@override
  void initState() {
    super.initState();

    setState(() {
      stream = fetchPost();
    });

  }

fetchPost():

Future<List<User>> fetchPost() async {
  final response = await http.get('url');
  final jsonResponse = json.decode(response.body);

  List<User> users = [];

  for(var u in jsonResponse){
    User user = User(
      id: u["id"].toString(), 
      uname: u["username"],
      firstname: u["firstname"],
      lastname: u["lastname"],
      email: u["email"],
    );
    users.add(user);
  }
  return users;
}

在我通过新页面更改列表中的某些内容(API 也更改)后,它会导航回 StreamBuilder:

Navigator.pushReplacement(
  context,
  new MaterialPageRoute(builder: (context) => new UserDart())
);        

但 StreamBuilder 有时不会刷新。我需要做什么才能刷新数据。所以每次页面加载时它都需要调用 fetchPost() 但是如何呢?

【问题讨论】:

  • fetchPost()的返回类型是什么?
  • 它返回一个用户列表。
  • @lordvidex 我将其添加到问题中。
  • 在 initState 方法中做 setState() 不是聪明的主意
  • @Eugene 我也可以使用stream: fetchPost().asStream(), 在 StreamBuilder 中编写它,但它仍然会刷新 10 次中的 8 次。我不明白为什么它有时会刷新,有时不会..

标签: flutter dart


【解决方案1】:

你可以这样写

    Navigator.pushReplacement(context,new MaterialPageRoute(
        builder: (context) => new UserDart())).then((onValue) {
                 fetchPost();  // this will called when it navigates back from UserDart 
    });

【讨论】:

  • 知道了,我现在试试
  • setStateinitState 中不起作用,因为initState 只会在第一次构建页面时调用。
猜你喜欢
  • 1970-01-01
  • 2020-06-25
  • 2021-10-28
  • 2023-04-05
  • 1970-01-01
  • 2011-01-27
  • 2019-02-07
  • 2019-08-03
  • 2021-03-02
相关资源
最近更新 更多