我希望能够在Widget完成构建/加载后运行函数,但我不确定如何。我目前的用例是检查用户是否经过身份验证,如果没有,则重定向到登录视图。我不想在之前检查并推送登录视图或主视图,它需要在主视图加载后发生。有什么我可以用来做这个吗?
你可以用
https://github.com/slightfoot/flutter_after_layout
在布局完成后只执行一次函数。或者只是看看它的实现并将其添加到您的代码中:-)
这基本上是
void initState() {
super.initState();
WidgetsBinding.instance
.addPostFrameCallback((_) => yourFunction(context));
}
更新:
提到的守则现在不再工作:
不工作:
WidgetsBinding.instance
.addPostFrameCallback((_) => yourFunction(context));
工作守则:
import 'package:flutter/scheduler.dart';
SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
如果你正在寻找ReactNative的componentDidMount
等价物,那么Flutter就有它。它不是那么简单,但它的工作方式是一样的。在Flutter中,Widget
s不直接处理他们的事件。相反,他们使用他们的State
对象来做到这一点。
class MyWidget extends StatefulWidget{
@override
State<StatefulWidget> createState() => MyState(this);
Widget build(BuildContext context){...} //build layout here
void onLoad(BuildContext context){...} //callback when layout build done
}
class MyState extends State<MyWidget>{
MyWidget widget;
MyState(this.widget);
@override
Widget build(BuildContext context) => widget.build(context);
@override
void initState() => widget.onLoad(context);
}
一旦屏幕完成渲染布局,就会立即调用State.initState
。如果您处于调试模式,即使在热重新加载时也不会再被调用,直到明确达到时间为止。
根据官方指南和sources,如果你想确定你的布局的最后一帧也被绘制,你可以写例如:
import 'package:flutter/scheduler.dart';
void initState() {
super.initState();
if (SchedulerBinding.instance.schedulerPhase == SchedulerPhase.persistentCallbacks) {
SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
}
}