Flutter 打开外部第三方应用

Flutter 打开外部第三方应用:url_launcher 插件的使用

https://pub.flutter-io.cn/packages/url_launcher/versions
pubspec.yaml 文件中添加

dev_dependencies:
  flutter_test:
    sdk: flutter
  url_launcher: ^6.0.10

Scaffold中 SnackBar的使用

// 需要设置Scaffold的key才能弹出SnackBar  
return Scaffold(
        key: _scaffoldkey,//
        appBar: AppBar(
          title: Text(title),
        ),
        body: ...,);

IOS 中需要添加白名单

Scheme 跳转协议:

  • 如跳转微信、QQ、高德地图等,都是改变相应的url协议地址即可,跳转原理参照原生开发使用的url scheme,比如一些常用的
  • 微信: weixin://
  • 京东: openapp.jdmoble://
  • 淘宝: taobao://
  • Chrome: googlechrome://
  • 百度地图: baidumap://
  • 高德地图:androidamap://、iosamap://

Flutter 打开外部第三方应用

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

class OpenApplication extends StatelessWidget {
  List<Map> buttons = [
    {'title': '打开浏览器', 'scheme': 'https://www.baidu.com'},
    {'title': '打开地图', 'scheme': 'geo:52.32.4.917'},
    {'title': '打开微信', 'scheme': 'weixin://'},
    {'title': '打开京东', 'scheme': 'openapp.jdmoble://'},
    {'title': '打开淘宝', 'scheme': 'taobao://'},
    {'title': '打开百度地图', 'scheme': ' baidumap://'},
  ];
  // 需要设置Scaffold的key才能弹出SnackBar
  var _scaffoldkey = GlobalKey<ScaffoldState>();
  @override
  Widget build(BuildContext context) {
    String title = (ModalRoute.of(context)!.settings.arguments as Map)['desc'];
    // TODO: implement build
    return Scaffold(
        key: _scaffoldkey,
        appBar: AppBar(
          title: Text(title),
        ),
        body: Column(
          children: [
            Column(
              children: buttons
                  .map((item) => _launchButton(
                      title: item['title'],
                      scheme: item['scheme'],
                      context: context))
                  .toList(),
            ),
            // FlatButton(
            //     onPressed: () {
            //       print('SnackBar');
            //       // final snackBar =
            //       //     new SnackBar(content: new Text('这是一个SnackBar'));
            //       // Scaffold.of(context).showSnackBar(snackBar);
            //       _scaffoldkey.currentState!.showSnackBar(
            //           SnackBar(content: new Text('这是一个SnackBar')));
            //     },
            //     child: Text('SnackBar'))
          ],
        ));
  }

  void _launchURL() async {
    const url = 'https://baidu.com';
    if (await canLaunch(url)) {
      await launch(url);
    } else {}
  }

  void _launchMap() async {
    //android
    const url = 'geo:52.32.4.917'; //App 提供的 schema
    if (await canLaunch(url)) {
      await launch(url);
    } else {}
  }

  Widget _launchButton(
      {required String title,
      required String scheme,
      required BuildContext context}) {
    return Container(
      child: FlatButton(
        onPressed: () {
          _launchScheme(scheme: scheme, context: context);
        },
        child: Container(
          margin: EdgeInsets.only(top: 18),
          width: double.infinity,
          height: 50,
          decoration: BoxDecoration(
            color: Color(0xff88ff22),
            borderRadius: BorderRadius.circular(25),
            boxShadow: [
              BoxShadow(
                  color: Colors.redAccent, blurRadius: 3, offset: Offset(0, 1))
            ],
          ),
          child: Center(
            child: Text(
              title,
              style: TextStyle(
                fontSize: 20,
                color: Colors.black,
              ),
            ),
          ),
        ),
      ),
    );
  }

  void _launchScheme(
      {required String scheme, required BuildContext context}) async {
    if (await canLaunch(scheme)) {
      await launch(scheme);
    } else {
      print('不支持打开');

      // 需要设置Scaffold的key才能弹出SnackBar
      _scaffoldkey.currentState!
          .showSnackBar(SnackBar(content: new Text('无法打开')));

      // Scaffold.of(context).showSnackBar(SnackBar(
      //   content: Text('老孟,一枚有态度的程序员'),
      // ));
    }
  }
}

上一篇:如何封禁IP和IP段?看完这篇我会了!! (转)


下一篇:hosts.allow和hosts.deny文件允许或禁止ssh或telnet操作