繁体   English   中英

如何使用 url_launcher 和 InkWell 的 onTap 只打开一次 url?

[英]how to open a url with url_launcher and onTap of InkWell only once?

  • 如果我触摸它一次,它会打印出 1 行 123

  • 如果我多次触摸它,它会打印出很多行 123

  • 那么当我多次触摸它时它会打印出 1 行 123 或退出 _launchUrl

  • 当我多次触摸它时,我也不得不回到那个次数以摆脱 _launchUrl

我的代码在这里 希望得到大家的帮助!

final Uri _url = Uri.parse('https://flutter.dev');

....


Future<void> _launchUrl() async {
    if (!await launchUrl(_url)) {
        throw 'Could not launch $_url';
    }
}

...

InkWell(
    onTap: () {
        _launchUrl;
        print('123');
    }    
)

我尝试使用等待功能,但仍然没有得到想要的结果

创建一个变量 buttonPressed 并将其默认设置为 false

bool buttonPressed = false;

在您的 onTap 中,您可以检查 buttonPressed 是否设置为 false。 如果它设置为 false,您可以将其设置为 true 并运行您的 _launchUrl 函数。 调用 _launchUrl 后,您可以将其设置回 false 以再次运行它。

if(buttonPressed == false){
  buttonPressed = true;
  await _launchUrl();
  buttonPressed = false;
}

同时将您的 onTap 标记为异步以使用 await 关键字

onTap: () async {

我通过以下方式修复它

Uri uri = Uri.parse('https://flutter.dev');
Navigator.of(context).push(
  MaterialPageRoute(
    builder: (context) => LoadURL(uri),
  )
);

// Navigate to here

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

class LoadURL extends StatelessWidget {
  late final Uri uri;
  LoadURL(this.uri);

  Future<void> _launchUrl(Uri uri) async {
    if (!await launchUrl(uri)) {
      throw 'Could not launch $uri';
    }
  }
  @override
  Widget build(BuildContext context) {
    return Center(
      child: FutureBuilder(
        future: _launchUrl(uri),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            Navigator.pop(context);
          }
          return CircularProgressIndicator();;
        },
      ),
    );
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM