我正在使用 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()。实现这一目标的正确方法是什么?
好吧,这实际上取决于“每次用户登陆主页时”到底是什么意思。
如果用户从 via 导航到HomePage
某个其他视图Navigator.push
,然后返回 via Navigator.pop
,则 的HomePage
状态保持不变,当然该initState
方法不会触发。
如果您想在HomePage
导航器中其上方的路线弹出时收到通知,那么您需要使用此方法,覆盖它,然后在其中您将能够调用_fetchData()
并更新主页的状态。
另一件事:当您有一些异步调用时,就像在 或任何其他框架方法_fetchData()
中调用它是一种错误的模式initState()
。因为它将被调用,并且build()
您的状态的方法几乎总是在异步调用结果返回之前立即被调用。处理这种情况的正确方法是使用FutureBuilder小部件。
如果“每次用户登陆主页”意味着其他含义,例如应用程序位于后台并被带到前台,或者当支持实现推送通知并且用户单击通知并打开应用程序时 - 此类情况也是如此可以处理,但这是一个更广泛的话题。
归档时间: |
|
查看次数: |
4723 次 |
最近记录: |