当前小部件完成加载后如何执行方法?

Posted

技术标签:

【中文标题】当前小部件完成加载后如何执行方法?【英文标题】:How to execute a method after current widget has finished loading? 【发布时间】:2021-04-05 13:57:18 【问题描述】:

我有一个带有 2 个小部件/页面的颤振应用程序,即: - 加载小部件/页面(在应用启动时出现) - 主页小部件/页面

我想在加载页面完成加载后启动主页。 基本上我的问题是 - 我怎样才能知道我的小部件何时完成加载?

以下是我的代码:

// My main.dart
import 'package:flutter/material.dart';
import 'package:routes/pages/home.dart';
import 'package:routes/pages/loading.dart';

void main() 
  runApp(MyApp());


class MyApp extends StatelessWidget 
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) 
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      routes: 
        '/': (context) => Loading(),
        '/home': (context) => Home(),
      ,
    );
  


class Loading extends StatefulWidget 
  @override
  _LoadingState createState() => _LoadingState();


class _LoadingState extends State<Loading> 
  @override
  void initState() 
    super.initState();
    // Below line of code causes problem. How can I call to route to new page after current widget has completed loading 
    launchAnotherWidgetAfterDoingSomething();
  

  void launchAnotherWidgetAfterDoingSomething() 
    // Do some necessary logic....
    Navigator.pushReplacementNamed(context, '/home');
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(
        title: Text('Loading screen'),
      ),
    );
  

【问题讨论】:

【参考方案1】:

你可以试试这个

@override
void initState() 
  super.initState();

  // ...
  _gotoHome();


// ...

void _gotoHome() 
  Future.delayed(Duration.zero, () 
    Navigator.of(context).pushReplacementNamed('/home')
  );

编辑 要在页面中构建每个小部件后触发操作,请将其添加到您的 initState

WidgetsBinding.instance.addPostFrameCallback((_) 
  // do what you want here
);

【讨论】:

这看起来只是添加延迟然后调用下一条路线?有没有一种合法的方法可以知道我名为Loading 的小部件何时完成构建?事实上,这正是我的问题。 'WidgetsBinding.instance.addPostFrameCallback' 是我要找的。谢谢! 很高兴它有帮助!

以上是关于当前小部件完成加载后如何执行方法?的主要内容,如果未能解决你的问题,请参考以下文章

ajax 请求后重新加载 dojo 小部件

如何正确删除小部件并更新/重新加载小部件

单击按钮后如何通过服务执行小部件更新?

如何在颤动中加载主小部件之前显示加载小部件?

在路由后,TextField单击重建/重新加载小部件

如何在 Flutter 小部件测试中等待未来完成?