Flutter 深度链接

时间:2021-06-22 09:57:32

标签: android flutter routes deep-linking

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

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

enter image description here

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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