#android #flutter #dart #visual-studio-code #deep-linking
#Android #flutter #dart #visual-studio-code #глубокая привязка
Вопрос:
Я пытаюсь добавить глубокие ссылки в свое приложение, я использую uni_links https://pub.dev/packages/uni_links
Я следовал инструкциям на странице, и в эмуляторе Android все работает нормально — я открываю приложение по глубокой ссылке, снимок содержит данные, и возвращается urlResponse. но на реальном устройстве, когда я открываю приложение по глубокой ссылке, снимок не содержит никаких данных, и возвращается домашняя страница.
вот мой код:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
primaryColor: Colors.white,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: StreamBuilder(
stream: getLinksStream(),
builder: (context, snapshot) {
if (snapshot.hasData) {
// our app started by configured links
Uri uri = Uri.parse(snapshot.data);
List<MapEntry<String, List<String>>> list =
uri.queryParametersAll.entries.toList();
return urlResponse(uri, list);
} else {
// our app started regularly
return HomePage();
}
},
),
);
}
и мой AndroidManifest.xml:
<!-- Deep Links -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with YOUR_SCHEME://YOUR_HOST -->
<data
android:scheme="http"
android:host="example.com"
android:pathPrefix="/myApp"/>
</intent-filter>
Кто-нибудь может помочь мне понять, почему это работает на эмуляторе, но не на реальном устройстве?
Ответ №1:
Я использовал uni_links в StatefulWidget
с getLinksStream()
таким образом:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:uni_links/uni_links.dart';
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
StreamSubscription _linkSubscription;
@override
Widget build(BuildContext context) {
return MaterialApp(
//...
);
}
@override
void initState() {
super.initState();
initDeepLink();
}
@override
void dispose() {
if (_linkSubscription != null) _linkSubscription.cancel();
super.dispose();
}
Future<void> initDeepLink() async {
_linkSubscription = getLinksStream().listen((url) {
if (!mounted) return;
setState(() {
//Here you have url data
Uri uri = Uri.parse(url);
List<MapEntry<String, List<String>>> list =
uri.queryParametersAll.entries.toList();
});
}, onError: (Object err) {
print("$err");
});
}