微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter 深度链接

如何解决Flutter 深度链接

根据 Flutter 的官方deep linking page,我们不需要任何插件或原生 Android/iOS 代码来处理深层链接

但它并没有真正告诉我们如何从该链接获取数据。我是从编码的角度说话。当然,他们在那里写道:

enter image description here

但这并没有告诉我哪里我应该写什么代码来实际获得完整的链接。我已经查找了示例/教程,但找不到任何不使用插件来处理深层链接内容

现在,我所做的只是在 <intent-filter> 文件添加 AndroidManifest.xml 标签,点击链接后,我的应用程序开始显示。但我不知道如何从该链接提取数据。

有人可以指导我吗?提前致谢。

解决方法

您需要特定于平台的代码来处理深度链接。如果你按照文档中提到的链接,你会找到完整的例子。

private val CHANNEL = "poc.deeplink.flutter.dev/channel"
private var startString: String? = null
override fun configureFlutterEngine(@NonNull flutterEngine:FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine)

MethodChannel(flutterEngine.dartExecutor,CHANNEL).setMethodCallHandler { call,result ->
    if (call.method == "initialLink") {
        if (startString != null) {
            result.success(startString)
        }
    }
 }
}


override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)

   val intent = getIntent()
   startString = intent.data?.toString()
}

颤动代码:

class DeepLinkBloc extends Bloc {

 //Event Channel creation
static const stream = const 
EventChannel('poc.deeplink.flutter.dev/events');

//Method channel creation
static const platform = const 
MethodChannel('poc.deeplink.flutter.dev/channel');

 StreamController<String> _stateController = StreamController();

 Stream<String> get state => _stateController.stream;

 Sink<String> get stateSink => _stateController.sink;


//Adding the listener into contructor
DeepLinkBloc() {
  //Checking application start by deep link
  startUri().then(_onRedirected);
  //Checking broadcast stream,if deep link was clicked in opened appication

  stream.receiveBroadcastStream().listen((d) => _onRedirected(d));
}


_onRedirected(String uri) {
  // Here can be any uri analysis,checking tokens etc,if it’s necessary
  // Throw deep link URI into the BloC's stream
  stateSink.add(uri);
}


  @override
  void dispose() {
    _stateController.close();
  }


  Future<String> startUri() async {
    try {
      return platform.invokeMethod('initialLink');
    } on PlatformException catch (e) {
      return "Failed to Invoke: '${e.message}'.";
    }
  }
}

点击此链接了解更多详情。

https://medium.com/flutter-community/deep-links-and-flutter-applications-how-to-handle-them-properly-8c9865af9283

,

或者,如果您不想通过特定于平台的代码传递,您可以使用 firebase 动态链接。这将允许您轻松收听来自两个平台的链接,并且您还可以获得以下优势:如果用户未安装该应用,您的链接将显示商品详情页面。

我在这里写了一个完整的例子:https://gbaccetta.medium.com/flutter-deep-linking-with-firebase-dynamic-links-and-bloc-architecture-660f0517fbc2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。