Flutter应用启动插件app_launcher的使用

发布于 1周前 作者 itying888 来自 Flutter

Flutter应用启动插件app_launcher的使用

Flutter 插件 app_launcher 提供了在 Android 和 iOS 设备上通过应用程序 ID 启动已安装应用程序的功能。本文将详细介绍该插件的使用方法,并提供一个完整的示例项目代码,帮助您快速上手。

插件概述

Pub License

app_launcher 是一个用于启动设备上已安装的应用程序的 Flutter 插件。它支持通过传递应用程序的包名(ID)来启动指定的应用程序。如果目标应用未安装,插件会尝试打开 Google Play 商店以引导用户下载该应用(目前仅支持 Android 平台)。

app_launcher_example

注意事项

  • 目前仅支持 Android 平台,欢迎贡献 iOS 支持。
  • androidApplicationId 参数不能为空或为 null

使用方法

要使用 app_launcher 插件,您只需调用其提供的静态方法 openApp 并传入目标应用的包名即可。此外,还可以使用 hasApp 方法检查某个应用是否已安装。

ElevatedButton(
  onPressed: () async {
    // 尝试打开 WhatsApp 应用
    await AppLauncher.openApp(
      androidApplicationId: "com.whatsapp",
    );
  },
  child: Text('Open WhatsApp'),
),

如果您想检查某个应用是否已安装,可以这样做:

final bool isInstalled = await AppLauncher.hasApp(
  androidApplicationId: "com.whatsapp",
);

if (isInstalled) {
  print('WhatsApp is installed');
} else {
  print('WhatsApp is not installed');
}

示例代码

下面是一个完整的示例项目,展示了如何在 Flutter 应用中集成和使用 app_launcher 插件。此示例创建了一个包含多个按钮的界面,每个按钮对应不同的操作,如打开特定应用或检查应用是否已安装。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: LauncherScreen(),
      theme: ThemeData(
        primarySwatch: Colors.orange,
        fontFamily: 'Arial',
      ),
    );
  }
}

class LauncherScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text(
          'App Launcher Example',
          style: TextStyle(color: Colors.white),
        ),
        centerTitle: true,
        backgroundColor: Colors.deepOrangeAccent,
      ),
      body: Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
            colors: [Colors.orangeAccent, Colors.deepOrange],
            begin: Alignment.topCenter,
            end: Alignment.bottomCenter,
          ),
        ),
        child: Center(
          child: Padding(
            padding: const EdgeInsets.symmetric(horizontal: 20.0),
            child: Column(
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                _buildCustomButton(
                  context,
                  title: 'Open Ludo Game',
                  onPressed: () async {
                    await AppLauncher.openApp(
                      androidApplicationId: "com.karuwaapps.ludo",
                    );
                  },
                ),
                SizedBox(height: 16),
                _buildCustomButton(
                  context,
                  title: 'Check for Ludo Game',
                  onPressed: () async {
                    final isInstalled = await AppLauncher.hasApp(
                      androidApplicationId: "com.karuwaapps.ludo",
                    );

                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text(
                          isInstalled
                              ? 'Ludo Game is installed'
                              : 'Ludo Game is not installed',
                        ),
                        backgroundColor: Colors.black87,
                      ),
                    );
                  },
                ),
                SizedBox(height: 16),
                _buildCustomButton(
                  context,
                  title: 'Check for VLC',
                  onPressed: () async {
                    final isInstalled = await AppLauncher.hasApp(
                      androidApplicationId: "org.videolan.vlc",
                    );

                    ScaffoldMessenger.of(context).showSnackBar(
                      SnackBar(
                        content: Text(
                          isInstalled
                              ? 'VLC is installed'
                              : 'VLC is not installed',
                        ),
                        backgroundColor: Colors.black87,
                      ),
                    );
                  },
                ),
                SizedBox(height: 16),
                _buildCustomButton(
                  context,
                  title: 'Open VLC',
                  onPressed: () async {
                    await AppLauncher.openApp(
                      androidApplicationId: "org.videolan.vlc",
                    );
                  },
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }

  Widget _buildCustomButton(BuildContext context,
      {required String title, required VoidCallback onPressed}) {
    return ElevatedButton(
      onPressed: onPressed,
      style: ElevatedButton.styleFrom(
        padding: EdgeInsets.symmetric(vertical: 16),
        backgroundColor: Colors.white,
        foregroundColor: Colors.deepOrangeAccent,
        shadowColor: Colors.deepOrange,
        elevation: 10,
        textStyle: TextStyle(
          fontSize: 18,
          fontWeight: FontWeight.bold,
        ),
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(30),
        ),
      ),
      child: Text(title),
    );
  }
}

未来工作

  • ✅ 完成 Android 平台支持。
  • ✅ 实现当应用未找到时自动跳转至 Google Play 商店。
  • ❌ 待实现 iOS 平台支持。
  • ❌ 待实现当应用未找到时自动跳转至 App Store。
  • ❌ 待增加参数传递功能。

贡献与许可

该项目是完全开源的,欢迎您提交问题或拉取请求以改进插件。项目遵循 MIT 许可证,详情请参阅 LICENSE 文件

希望以上信息对您有所帮助!如果您有任何疑问或需要进一步的帮助,请随时提问。


更多关于Flutter应用启动插件app_launcher的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用启动插件app_launcher的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用app_launcher插件来启动其他应用的示例代码。app_launcher插件允许你从Flutter应用中启动系统上的其他已安装应用。

首先,你需要在你的pubspec.yaml文件中添加app_launcher依赖:

dependencies:
  flutter:
    sdk: flutter
  app_launcher: ^0.10.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以使用以下代码来启动其他应用。以下是一个完整的示例,包括按钮点击事件来启动指定的应用(例如,浏览器的URL或另一个应用的包名):

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'App Launcher Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  void _launchAppWithPackageName() async {
    try {
      // 替换为你想要启动的应用的包名
      String packageName = "com.android.chrome"; // 例如,Chrome浏览器的包名
      bool canLaunch = await canLaunchApp(packageName);
      if (canLaunch) {
        await launchApp(packageName);
        print("App launched successfully");
      } else {
        print("App not installed or cannot be launched");
      }
    } catch (e) {
      print("Error launching app: $e");
    }
  }

  void _launchAppWithUrl() async {
    try {
      // 替换为你想要打开的URL
      String url = "https://www.example.com";
      bool canLaunch = await canLaunchUrl(Uri.parse(url));
      if (canLaunch) {
        await launchUrl(Uri.parse(url));
        print("URL launched successfully");
      } else {
        print("Cannot launch URL");
      }
    } catch (e) {
      print("Error launching URL: $e");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('App Launcher Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _launchAppWithPackageName,
              child: Text('Launch App by Package Name'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _launchAppWithUrl,
              child: Text('Launch URL'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们有两个按钮,一个用于通过包名启动应用,另一个用于通过URL启动浏览器。

  1. _launchAppWithPackageName函数检查是否可以启动指定的应用包名,如果可以,则启动它。
  2. _launchAppWithUrl函数检查是否可以启动指定的URL,如果可以,则启动它。

注意:

  • 某些应用可能不允许从其他应用启动,这取决于该应用的AndroidManifest.xmlInfo.plist中的配置。
  • 某些操作系统限制可能会阻止某些应用的启动,例如在没有用户交互的情况下启动应用。

希望这个示例对你有帮助!

回到顶部