Flutter: запускать функцию каждый раз, когда приложение показывает и принудительно загружать виджеты - PullRequest
0 голосов
/ 28 апреля 2020

Я сделал ОЧЕНЬ ПРОСТОЕ приложение для компании, в которой я работаю. Приложение просто открывает страницу в браузере, когда оно открывается (оно работает так же, как ярлык для сайта, кажется, глупо sh, но для очень простые люди).

Но у меня 2 проблемы.

1 - Я поставил функцию, чтобы открыть страницу в initState. Но скажем, пользователь однажды открыл приложение и снова вернулся в приложение. функция не будет работать, потому что приложение было построено ранее. Есть ли способ запускать функцию каждый раз, когда приложение показывает?

2 - Чтобы решить вышеуказанную проблему, я создал кнопку, по которой пользователь нажимает и вызывает функцию, и это нормально. Но у меня также есть компания lo go над кнопкой, и когда я открываю приложение, кнопка загружается раньше, чем lo go, и пользователь жаловался на это (размер изображения не проблема, его размер составляет всего 20 КБ). Есть ли способ заставить кнопку (и все) загружаться сразу после загрузки изображения? Поставить индикатор загрузки до того, как все загрузится.

Код:

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),
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}


1 Ответ

0 голосов
/ 28 апреля 2020

Вы можете использовать WidgetsBindingObserver. Это просто наблюдает за AppLifecycleState. Вы можете вызвать метод _launchURL, когда приложение вернется к AppLifecycleState.resume.

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),
                      ),
                    ),
                  ],
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Для получения дополнительной информации: - WidgetBindingObserver

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...