我希望能够在Widget完成构建/加载后运行函数,但我不确定如何.我目前的用例是检查用户是否经过身份验证,如果没有,则重定向到登录视图.我不想在之前检查并推送登录视图或主视图,它需要在主视图加载后发生.有什么我可以用来做这个吗?
谢谢
Tho*_*mas 80
你可以用
https://github.com/slightfoot/flutter_after_layout
在布局完成后只执行一次函数.或者只是看看它的实现并将其添加到您的代码中:-)
这基本上是
void initState() {
super.initState();
WidgetsBinding.instance
.addPostFrameCallback((_) => yourFunction(context));
}
Run Code Online (Sandbox Code Playgroud)
anm*_*ail 41
更新: Flutter v1.8.4
上面提到的两个代码现在都可以正常工作:
工作方式:
WidgetsBinding.instance
.addPostFrameCallback((_) => yourFunction(context));
Run Code Online (Sandbox Code Playgroud)
工作中
import 'package:flutter/scheduler.dart';
SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
Run Code Online (Sandbox Code Playgroud)
小智 40
有3种可能的方式:
1) WidgetsBinding.instance.addPostFrameCallback((_) => yourFunc(context));
2) Future.delayed(Duration.zero, () => yourFunc(context));
3) Timer.run(() => yourFunc(context));
Run Code Online (Sandbox Code Playgroud)
至于context
,我需要在Scaffold.of(context)
我的所有小部件渲染后使用它。
但在我看来,最好的方法是这样的:
void main() async {
WidgetsFlutterBinding.ensureInitialized(); //all widgets are rendered here
await yourFunc();
runApp( MyApp() );
}
Run Code Online (Sandbox Code Playgroud)
jit*_*555 35
这样做的最佳方法,
1. WidgetsBinding
WidgetsBinding.instance.addPostFrameCallback((_) {
print("WidgetsBinding");
});
Run Code Online (Sandbox Code Playgroud)
2.调度器绑定
SchedulerBinding.instance.addPostFrameCallback((_) {
print("SchedulerBinding");
});
Run Code Online (Sandbox Code Playgroud)
它可以在 insideinitState
调用,在 Build widgets 完成渲染后只会调用一次。
@override
void initState() {
// TODO: implement initState
super.initState();
print("initState");
WidgetsBinding.instance.addPostFrameCallback((_) {
print("WidgetsBinding");
});
SchedulerBinding.instance.addPostFrameCallback((_) {
print("SchedulerBinding");
});
}
Run Code Online (Sandbox Code Playgroud)
上面两个代码的工作原理相同,因为它们都使用类似的绑定框架。对于差异,请找到以下链接。
https://medium.com/flutterworld/flutter-schedulerbinding-vs-widgetsbinding-149c71cb607f
jer*_*nho 12
如果你正在寻找 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);
}
Run Code Online (Sandbox Code Playgroud)
State.initState
一旦屏幕完成渲染布局,将立即调用。如果您处于调试模式,即使在热重载时也不会再次被调用,直到明确达到这样做的时间。
Uch*_*dim 10
在 Flutter 1.14.6 版,Dart 28 版中。
以下是对我有用的方法,您只需要将构建方法之后想要发生的所有事情捆绑到一个单独的方法或函数中。
@override
void initState() {
super.initState();
print('hello girl');
WidgetsBinding.instance
.addPostFrameCallback((_) => afterLayoutWidgetBuild());
}
Run Code Online (Sandbox Code Playgroud)
小智 8
PostFrameCallback 在屏幕完全绘制之前触发。因此,Devv 的上述答案对于增加屏幕绘制延迟很有帮助。
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
Future.delayed(Duration(seconds: 3), () => yourFunction());
});
}
Run Code Online (Sandbox Code Playgroud)
根据官方指南和消息来源,如果您想确定还绘制了布局的最后一帧,则可以编写例如:
import 'package:flutter/scheduler.dart';
void initState() {
super.initState();
if (SchedulerBinding.instance.schedulerPhase == SchedulerPhase.persistentCallbacks) {
SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
}
}
Run Code Online (Sandbox Code Playgroud)
如果您对新的 SDK 和旧的答案有问题,您可以尝试我的解决方案。我已经在v3.0.4上测试过它
WidgetsBinding.instance.endOfFrame.then(
(_) {
if (mounted) {
// do some suff
// you can get width height of specific widget based on GlobalKey
};
},
);
Run Code Online (Sandbox Code Playgroud)
尝试 SchedulerBinding,
SchedulerBinding.instance
.addPostFrameCallback((_) => setState(() {
isDataFetched = true;
}));
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
32812 次 |
最近记录: |