使用 Flutter/Dart 的 Url Launcher

用户13821109

各位晚上好

我在使用 URL 启动器时遇到了一个小问题。基本上,我想要做的是从 Future 函数(从 API 检索)获取 URL,然后在按下凸起按钮后导航到该 URL。我实现的代码有效,但并非没有一个小而讨厌的错误。该错误出现大约半秒到一秒(我假设直到 API 返回 URL),然后凸起的按钮被绘制到屏幕上并且工作正常;然后我就可以导航到该站点。我试图完全摆脱这个错误。为了节省您一些时间,相关的 FutureBuilder 是第二个。下面是我的代码:

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

import '../models/yahoo_finance_stock_info.dart';
import '../providers/companies_provider.dart';

class BusinessScreen extends StatefulWidget {
  static const routeName = '/business-screen';

  @override
  _BusinessScreenState createState() => _BusinessScreenState();
}

class _BusinessScreenState extends State<BusinessScreen>
    with AutomaticKeepAliveClientMixin<BusinessScreen> {
  @override
  bool get wantKeepAlive => true;

  Future _companyDescription;
  Future _urlForUrlLauncher;

  var _isInit = true;

  @override
  void didChangeDependencies() {
    if (_isInit) {
      final companyTicker = ModalRoute.of(context).settings.arguments as String;
      final loadedCompany = Provider.of<Companies>(context, listen: false)
          .findByTicker(companyTicker);

      _companyDescription =
          Companies().getSecurityExtendStats(loadedCompany.tickerSymbol);

      _urlForUrlLauncher =
          Companies().getHistoricalData(loadedCompany.tickerSymbol);
    }
    _isInit = false;
    super.didChangeDependencies();
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    _companyDescription;
  }

  @override
  Widget build(BuildContext context) {
    super.build(context);
    final companyTicker = ModalRoute.of(context).settings.arguments as String;
    final loadedCompany = Provider.of<Companies>(context, listen: false)
        .findByTicker(companyTicker);

    return Container(
      color: Colors.black87,
      child: Column(
        children: <Widget>[
          Container(
            height: 300,
            width: double.infinity,
            color: Colors.white,
            padding: EdgeInsets.all(10),
            child: SingleChildScrollView(
              padding: EdgeInsets.only(left: 15),
              scrollDirection: Axis.vertical,
              child: FutureBuilder<StockInformation>(
                future: _companyDescription,
                builder: (BuildContext context,
                    AsyncSnapshot<StockInformation> snapshot) {
                  if (snapshot.data != null) {
                    return Text(snapshot.data.assetProfile.longBusinessSummary);
                  }
                  return Container(
                    height: 300,
                    child: Center(
                      child: CircularProgressIndicator(),
                    ),
                  );
                },
              ),
            ),
          ),
          Container(
            height: 75,
            width: double.infinity,
            child: Center(
              child: FutureBuilder(
                future: _urlForUrlLauncher,
                builder: (BuildContext context, AsyncSnapshot snapshot) {
                  if (snapshot.data[0]['finalLink'] != null) {
                    String url10K = snapshot.data[0]['finalLink'];
                    return RaisedButton(
                      shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(10),
                        side: BorderSide(
                          color: Colors.grey,
                          width: 1,
                        ),
                      ),
                      onPressed: () async {
                        var url = url10K;
                        if (await canLaunch(url)) {
                          await launch(url);
                        } else {
                          throw 'Could not launch $url';
                        }
                      },
                      child: Text(
                        'Go to company\'s filings',
                        style: TextStyle(
                          color: Colors.white,
                        ),
                      ),
                    );
                  } else {
                    return RaisedButton(
                      shape: RoundedRectangleBorder(
                        borderRadius: BorderRadius.circular(10),
                        side: BorderSide(
                          color: Colors.grey,
                          width: 1,
                        ),
                      ),
                      onPressed: null,
                      child: Text(
                        'Go to company\'s filings',
                        style: TextStyle(color: Colors.white,),
                      ),
                    );
                  }
                },
              ),
            ),
          )
        ],
      ),
    );
  }
}

在此先感谢您对这个问题的任何帮助!

纳瓦尼特

在第二次FutureBuilder改变条件,

builder: (BuildContext context, AsyncSnapshot snapshot) {
  if (snapshot.data != null && snapshot.data[0]['finalLink'] != null) {
    // raised button with onpressed
  } else {
    // raised button with onpressed as null
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 Url_launcher 打开网站 url_launcher: ^6.0.6

使用URL Launcher插件时从Firestore调用URL

如何使用 url_launcher 包从 Cloud Firestore 添加 URL

使用Url_launcher在tel uri中添加#登录

如何使用 url_launcher 在 flutter 应用程序中打开 URL?

如何使用带有flutter的URL_launcher包发送短信?

你如何在颤振中使用 url_launcher 捕获 canLaunch 异常?

如何使用 url_launcher 打开已安装的应用程序,否则在浏览器中打开?

为什么使用最新的 url_launcher 6.1.2 不适用于 pdf,但以前的版本可以?

使用CocoonJS Launcher运行Cordova示例项目

无法解析配置':url_launcher:lintClassPath'的所有文件

firebase auth 和 url_launcher 版本冲突

Flutter-从url_launcher获取HTTP响应

Flutter Url Launcher不会将整个文本传递给短信

Flutter url_launcher 在调用时忽略 number sing(#)

Flutter url_launcher 在调用时忽略数字符号(#)

Flutter url_launcher未处理的异常:无法启动youtube url(由canLaunch引起)

通过karma-phantomjs-launcher强制使用1.9.8 PhantomJS

如何使用org.apache.spark.launcher.SparkLauncher设置队列

由于上述问题,无法构建flutter插件url_launcher_macos

url_launcher 插件在 Android 和 iOS 上的不同行为

如何在Flutter中打开像``URL Launcher''这样的``csv文件''

url_launcher mailto 方案中的空格被转换为+ | 颤振

如何测试电子邮件应用程序打开的 flutter url_launcher?

Flutter-Android Studio-无法正确识别url_launcher导入

Flutter-Web:url_launcher链接小部件鼠标悬停

flutter用url_launcher uri发送电子邮件

颤振发送带有 URL_launcher 的短信和正文 gat 表单对话框

颤振 url_launcher 包不适用于 iOS 设备