我想能够运行函数一旦一个小部件已经完成构建/加载,但我不确定如何。

我目前的用例是检查用户是否通过身份验证,如果没有,则重定向到登录视图。我不想检查之前,并推动登录视图或主视图,它需要发生后,主视图已加载。

有什么我可以用的吗?


当前回答

有三种可能的方法:

1) WidgetsBinding.instance.addPostFrameCallback((_) => yourFunc(context));

2) Future.delayed(Duration.zero, () => yourFunc(context));

3) Timer.run(() => yourFunc(context));

至于context,在渲染完所有的小部件后,我需要在Scaffold.of(context)中使用它。

但在我看来,最好的办法是:

void main() async {
  WidgetsFlutterBinding.ensureInitialized(); //all widgets are rendered here
  await yourFunc();
  runApp( MyApp() );
}

其他回答

我有一个有状态的小部件,我使用html_editor_enhanced插件小部件。这是在其中设置初始消息的唯一方法。

class _SendChatMessageState extends State<SendChatMessage> {
  final _htmlController = HtmlEditorController();

      @override
      void initState() {
        super.initState();
    
          Future.delayed(const Duration(seconds: 3), () {
            _htmlController.setText(widget.chatMessage.message ?? '');
          });
      }

我尝试了addPostFrameCallback,但它不起作用,因为JavaScript生成异常“HTML编辑器仍在加载,请在评估此JS之前等待…”

如果你不想使用WidgetsBinding或SchedulerBinding:

使用Future或Timer(简单) Future<void> _runsAfterBuild() async { //此代码在build… } @override 小部件构建(BuildContext上下文){ 未来(_runsAfterBuild);// <——使用Future或Timer 返回容器(); } 等待一个虚拟的未来 Future<void> _runsAfterBuild() async { 等待未来((){});// <——虚拟等待 //此代码在build… } @override 小部件构建(BuildContext上下文){ _runsAfterBuild (); 返回容器(); }

更新:Flutter v1.8.4

上述两个代码现在都在工作:

工作:

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

工作

import 'package:flutter/scheduler.dart';

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

另一个对我来说工作得很好的解决方案是包装你想通过Future.delayed()调用的函数,如下所示:

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
       Future.delayed(Duration(seconds: 3), () => yourFunction());
    });
  }

尝试SchedulerBinding,

 SchedulerBinding.instance
                .addPostFrameCallback((_) => setState(() {
              isDataFetched = true;
            }));