Flutter如何处理scheme打开app

在Flutter中如何实现通过URL scheme打开APP的功能?我想让用户点击特定格式的链接时(比如myapp://home)能够直接跳转到我的Flutter应用,并传递参数到指定页面。具体应该怎么配置Android和iOS的原生端?Flutter层又该如何接收和处理这些scheme参数?有没有完整的实现示例或最佳实践?

2 回复

Flutter通过uni_links插件处理scheme打开应用。在AndroidManifest.xmlInfo.plist中配置scheme,监听getInitialLinklinkStream实现页面跳转。

更多关于Flutter如何处理scheme打开app的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中处理scheme打开应用主要通过以下步骤实现:

1. 配置Android清单文件

android/app/src/main/AndroidManifest.xml中添加intent过滤器:

<activity
    android:name=".MainActivity"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="yourapp" />
    </intent-filter>
</activity>

2. 配置iOS Info.plist

ios/Runner/Info.plist中添加:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>yourapp</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>yourapp</string>
        </array>
    </dict>
</array>

3. 使用uni_links包处理路由

安装依赖:

dependencies:
  uni_links: ^0.5.1

在Flutter代码中处理:

import 'package:uni_links/uni_links.dart';

class _MyAppState extends State<MyApp> {
  StreamSubscription _sub;

  @override
  void initState() {
    super.initState();
    _handleInitialUri();
    _sub = getUriLinksStream().listen(_handleUri);
  }

  void _handleInitialUri() async {
    try {
      final uri = await getInitialUri();
      if (uri != null) _navigate(uri);
    } catch (e) {
      print('Initial uri error: $e');
    }
  }

  void _handleUri(Uri uri) {
    _navigate(uri);
  }

  void _navigate(Uri uri) {
    // 解析uri并跳转到对应页面
    if (uri.path == '/detail') {
      Navigator.push(context, MaterialPageRoute(
        builder: (context) => DetailPage(id: uri.queryParameters['id']),
      ));
    }
  }

  @override
  void dispose() {
    _sub?.cancel();
    super.dispose();
  }
}

使用示例

在浏览器或其它应用中通过链接打开:

yourapp://detail?id=123

注意事项

  • 测试时确保完全关闭应用后再通过链接打开
  • 不同平台可能需要不同的配置方式
  • 建议对uri进行有效性验证

这样就能实现通过scheme链接打开Flutter应用并跳转到指定页面的功能。

回到顶部