Flutter:Widget构建完成后运行方法

问题描述 投票:20回答:4

我希望能够在Widget完成构建/加载后运行函数,但我不确定如何。我目前的用例是检查用户是否经过身份验证,如果没有,则重定向到登录视图。我不想在之前检查并推送登录视图或主视图,它需要在主视图加载后发生。有什么我可以用来做这个吗?

dart flutter
4个回答
58
投票

你可以用

https://github.com/slightfoot/flutter_after_layout

在布局完成后只执行一次函数。或者只是看看它的实现并将其添加到您的代码中:-)

这基本上是

  void initState() {
    super.initState();
    WidgetsBinding.instance
        .addPostFrameCallback((_) => yourFunction(context));
  }

20
投票

更新:

提到的守则现在不再工作:

不工作:

WidgetsBinding.instance
        .addPostFrameCallback((_) => yourFunction(context));

工作守则:

import 'package:flutter/scheduler.dart';

SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));

4
投票

如果你正在寻找ReactNative的componentDidMount等价物,那么Flutter就有它。它不是那么简单,但它的工作方式是一样的。在Flutter中,Widgets不直接处理他们的事件。相反,他们使用他们的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。如果您处于调试模式,即使在热重新加载时也不会再被调用,直到明确达到时间为止。


4
投票

Flutter 1.2 - dart 2.2

根据官方指南和sources,如果你想确定你的布局的最后一帧也被绘制,你可以写例如:

import 'package:flutter/scheduler.dart';

void initState() {
   super.initState();
   if (SchedulerBinding.instance.schedulerPhase == SchedulerPhase.persistentCallbacks) {
        SchedulerBinding.instance.addPostFrameCallback((_) => yourFunction(context));
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.