Android 颤振:每次应用程序显示时运行一个函数,同时强制加载小部件

Android 颤振:每次应用程序显示时运行一个函数,同时强制加载小部件,android,flutter,dart,Android,Flutter,Dart,我为我工作的公司制作了一个非常简单的应用程序。 当应用程序打开时,它只是在浏览器上打开一个页面(它就像一个网站的快捷方式,看起来很愚蠢,但对非常简单的人来说) 但我有两个问题 1-我将打开页面的函数设置为initState。但假设用户打开了应用程序一次,然后再次返回应用程序。该功能将不会运行,因为该应用程序是以前生成的。是否有办法在每次应用程序显示时运行该功能 2-为了解决上面的问题,我创建了一个按钮,用户可以点击并调用该函数,这样就可以了。 但我的按钮上方还有公司徽标,当我打开应用程序时,按钮

我为我工作的公司制作了一个非常简单的应用程序。 当应用程序打开时,它只是在浏览器上打开一个页面(它就像一个网站的快捷方式,看起来很愚蠢,但对非常简单的人来说)

但我有两个问题

1-我将打开页面的函数设置为initState。但假设用户打开了应用程序一次,然后再次返回应用程序。该功能将不会运行,因为该应用程序是以前生成的。是否有办法在每次应用程序显示时运行该功能

2-为了解决上面的问题,我创建了一个按钮,用户可以点击并调用该函数,这样就可以了。 但我的按钮上方还有公司徽标,当我打开应用程序时,按钮会在徽标之前加载,一位用户对此表示不满(图像大小不是问题,它只有20kb)。有没有办法让按钮(和所有东西)在图像加载后立即加载?在加载所有内容之前放置加载指示器

守则:

import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

**//the function:**
_launchURL() async {
  const url =
      'https://dev.testsite/pages/envio/document.php';
  if (await canLaunch(url)) {
    await launch(url);
  } else {
    throw 'Error';
  }

}

class _MyAppState extends State<MyApp> {
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) => _launchURL());
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          color: Colors.blueGrey[100],
          child: Column(
            children: <Widget>[
              SafeArea(
                child: Padding(
                  padding: EdgeInsets.only(top: 5.0),
                  child: Image.asset(
                    'assets/logo.png', **//the image**
                  ),
                ),
              ),
              Padding(
                padding: const EdgeInsets.fromLTRB(5.0, 40.0, 5.0, 30.0),
                child: Text(
                  "Click the button if the \npage didn't load",
                  style: TextStyle(
                    fontSize: 18,
                  ),
                  textAlign: TextAlign.center,
                ),
              ),
              Padding(
                padding: EdgeInsets.only(top: 30.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    SizedBox(
                      width: 250,
                      height: 150,
                      child: RaisedButton(
                        elevation: 20.0,
                        shape: StadiumBorder(
                            //borderRadius: new BorderRadius.circular(20.0),
                            side: BorderSide(
                                color: Color.fromRGBO(194, 39, 56, 1.0))),
                        color: Color.fromRGBO(194, 39, 56, 1.0),
                        onPressed: _launchURL,
                        child: Icon(Icons.arrow_right,
                            color: Color.fromRGBO(20, 21, 46, 1.0), size: 120),
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}


导入“包装:颤振/材料.省道”;
导入“package:url_launcher/url_launcher.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了StatefulWidget{
@凌驾
_MyAppState createState()=>\u MyAppState();
}
**//职能:**
_启动URL()异步{
常量url=
'https://dev.testsite/pages/envio/document.php';
如果(等待canLaunch(url)){
等待发射(url);
}否则{
抛出“错误”;
}
}
类MyAppState扩展了状态{
void initState(){
super.initState();
WidgetsBinding.instance.addPostFrameCallback((\u)=>\ u launchURL());
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
主体:容器(
颜色:颜色。蓝灰色[100],
子:列(
儿童:[
安全区(
孩子:填充(
填充:仅限边缘设置(顶部:5.0),
子:Image.asset(
“assets/logo.png”,**//图像**
),
),
),
填充物(
填充:LTRB(5.0,40.0,5.0,30.0)中的常数边集,
子:文本(
“如果页面未加载,请单击按钮”,
样式:TextStyle(
尺码:18,
),
textAlign:textAlign.center,
),
),
填充物(
填充:仅限边缘设置(顶部:30.0),
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
大小盒子(
宽度:250,
身高:150,
孩子:升起按钮(
标高:20.0,
形状:StadiumBorder(
//边界半径:新边界半径。圆形(20.0),
边线(
颜色:color.fromRGBO(194,39,56,1.0)),
颜色:颜色。来自RGBO(194,39,56,1.0),
onPressed:_launchURL,
子:图标(Icons.arrow_right,
颜色:颜色。来自RGBO(20,21,46,1.0),尺寸:120),
),
),
],
),
),
],
),
),
),
);
}
}

您可以使用
WidgetsBindingObserver
。它只是观察
AppLifecycleState
。 当应用程序返回到
AppLifecycleState.resume
时,可以调用
\u launchURL
方法

class _MyAppState extends State<MyApp>  with WidgetsBindingObserver {
  void initState() {
    super.initState();
   WidgetsBinding.instance.addObserver(this);
   }

  @override
   void dispose() {
     WidgetsBinding.instance.removeObserver(this);
     super.dispose();
   }

//// override this function
 @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if(state == AppLifecycleState.resumed)
 /// when user opens app again you can launch url if not already launched.
      _launchURL();
  }


  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Container(
          color: Colors.blueGrey[100],
          child: Column(
            children: <Widget>[
              SafeArea(
                child: Padding(
                  padding: EdgeInsets.only(top: 5.0),
                  child: Image.asset(
                    'assets/logo.png', **//the image**
                  ),
                ),
              ),
              Padding(
                padding: const EdgeInsets.fromLTRB(5.0, 40.0, 5.0, 30.0),
                child: Text(
                  "Click the button if the \npage didn't load",
                  style: TextStyle(
                    fontSize: 18,
                  ),
                  textAlign: TextAlign.center,
                ),
              ),
              Padding(
                padding: EdgeInsets.only(top: 30.0),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: <Widget>[
                    SizedBox(
                      width: 250,
                      height: 150,
                      child: RaisedButton(
                        elevation: 20.0,
                        shape: StadiumBorder(
                            //borderRadius: new BorderRadius.circular(20.0),
                            side: BorderSide(
                                color: Color.fromRGBO(194, 39, 56, 1.0))),
                        color: Color.fromRGBO(194, 39, 56, 1.0),
                        onPressed: _launchURL,
                        child: Icon(Icons.arrow_right,
                            color: Color.fromRGBO(20, 21, 46, 1.0), size: 120),
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
class\u MyAppState使用WidgetsBindingObserver扩展状态{
void initState(){
super.initState();
WidgetsBinding.instance.addObserver(这个);
}
@凌驾
无效处置(){
WidgetsBinding.instance.removeObserver(此);
super.dispose();
}
////覆盖此功能
@凌驾
void didchangeAppifecyclestate(AppLifecycleState状态){
if(state==AppLifecycleState.resume)
///当用户再次打开应用程序时,若尚未启动,则可以启动url。
_启动URL();
}
@凌驾
小部件构建(构建上下文){
返回材料PP(
家:脚手架(
主体:容器(
颜色:颜色。蓝灰色[100],
子:列(
儿童:[
安全区(
孩子:填充(
填充:仅限边缘设置(顶部:5.0),
子:Image.asset(
“assets/logo.png”,**//图像**
),
),
),
填充物(
填充:LTRB(5.0,40.0,5.0,30.0)中的常数边集,
子:文本(
“如果页面未加载,请单击按钮”,
样式:TextStyle(
尺码:18,
),
textAlign:textAlign.center,
),
),
填充物(
填充:仅限边缘设置(顶部:30.0),
孩子:排(
mainAxisAlignment:mainAxisAlignment.center,
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
大小盒子(
宽度:250,
身高:150,
孩子:升起按钮(
标高:20.0,
形状:StadiumBorder(
//边界半径:新边界半径。圆形(20.0),
边线(
颜色:color.fromRGBO(194,39,56,1.0)),
颜色:颜色。来自RGBO(194,39,56,1.0),
onPressed:_launchURL,
C