相当于 Flutter 中的 viewWillAppear()

Rut*_*ans 7 ios dart flutter

我正在使用 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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*dar 3

好吧,这实际上取决于“每次用户登陆主页时”到底是什么意思。

如果用户从 via 导航到HomePage某个其他视图Navigator.push,然后返回 via Navigator.pop,则 的HomePage状态保持不变,当然该initState方法不会触发。

如果您想在HomePage导航器中其上方的路线弹出时收到通知,那么您需要使用方法,覆盖它,然后在其中您将能够调用_fetchData()并更新主页的状态。

另一件事:当您有一些异步调用时,就像在 或任何其他框架方法_fetchData()中调用它是一种错误的模式initState()。因为它将被调用,并且build()您的状态的方法几乎总是在异步调用结果返回之前立即被调用。处理这种情况的正确方法是使用FutureBuilder小部件。

如果“每次用户登陆主页”意味着其他含义,例如应用程序位于后台并被带到前台,或者当支持实现推送通知并且用户单击通知并打开应用程序时 - 此类情况也是如此可以处理,但这是一个更广泛的话题。