ios - 等价于 Flutter 中的 viewWillAppear()

标签 ios flutter dart

我正在使用 Flutter 重建一个 iOS 应用程序,流程如下:
每次用户登陆主页时,都会从后端重新加载用户数据以检查是否有任何变化。

我在 Swift/iOS 中实现这一点的方法是使用 viewDidLoad() 函数。

我的 Flutter 代码是这样的:

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  User user = User();

  @override
  void dispose() {
    super.dispose();
  }

  @override
  void initState() {
    super.initState();
    _fetchData(context);
  }

  @override
  Widget build(BuildContext context) {
    return Container(
        color: RColor.COLOR_main,
        child: Column(
          children: [
            Container(
              height: MediaQuery.of(context).size.height / 7,
              width: MediaQuery.of(context).size.width,
              padding: EdgeInsets.all(20),
              child: Container(
                child: Text("This is the homepage"),
                alignment: Alignment.bottomCenter,
              ),
            ),
          ],
        ));
  }

  Future _fetchData(BuildContext context) async {
    _fetchUserAPI(context);
  }

  Future _fetchUserAPI(BuildContext context) async {
    try {
      SharedPreferences prefs = await SharedPreferences.getInstance();
      var accessToken = prefs.getString("access_token");
      var url = RConstants.API_BASE_URL + "/v1/users/self";
      Response response = await Dio()
          .get(url, options: Options(headers: {"Authorization": accessToken}));
      setState(() {
        user = User.fromJson(response.data);
      });
    } catch (e) {
      print(e.toString());
      Alert(
              context: context,
              title: "Something Went Wrong",
              desc: "Something went wrong while fetching your user data",
              type: AlertType.error)
          .show();
    }
  }
}

但是,void initState() 不会在每次用户登陆主页时触发。实现这一目标的正确方法是什么?

最佳答案

好吧,这实际上取决于您所说的“每次用户登陆主页”的确切含义。
如果用户从 HomePage 导航通过Navigator.push查看其他 View 然后通过Navigator.pop返回然后 HomePage的状态保持不变,当然 initState方法不触发。
如果您想在 HomePage 上获得通知如果在导航器中它上面的路线被弹出,那么你需要使用 this方法,覆盖它,然后在其中你将能够调用 _fetchData()并更新主页的状态。
还有一件事:当你有一些像 _fetchData() 这样的异步调用时在 initState() 中调用它是错误的模式。或任何其他框架方法。因为它将被调用并且 build()几乎总是在异步调用的结果返回之前立即调用您状态的方法。处理这种情况的正确方法是使用 FutureBuilder小部件。
如果“每次用户登陆主页”意味着其他东西,例如应用程序在后台并被带到前台,或者当支持实现推送通知并且用户单击通知并打开应用程序时 - 这种情况也可以处理,但这是一个更广泛的主题。

关于ios - 等价于 Flutter 中的 viewWillAppear(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56511527/

相关文章:

iphone - 通过导航栏按钮的操作在 UITableview 中设置删除按钮

ios - uitableview 不会为每次点击打印行索引值

flutter - ( flutter )使用FutureBuilder的ListView.builder不起作用

android - 如何在 Flutter 中将事件从一个有状态小部件广播到另一个小部件

android - 一次性读取Firebase云( Dart/flutter )

ios - 如何将 PHAsset 存储到 Core Data

ios - 如何让联网的软件意识到自己?

android - 在构建Home()时引发了以下NoSuchMethodError:在null上调用了 '>'方法。接收方:null尝试调用:>(1)

unicode - 在 Dart 中处理字素簇

flutter - 如何将参数从一个选项卡传递到另一个选项卡?