Ami*_*nan 11 share widget package deep-linking flutter
我有一个 Netflix 模型应用程序,我想与其他人分享电影内容,如果接收者有该应用程序,那么内容应该在他/她的应用程序中打开,或者如果应用程序不存在,则访问网站。
我尝试使用 Firebase,但效果不太好,所以我尝试在 flutter 中使用 uni_links,但这是我第一次使用它,没有找到太多关于它的教程。
下面是我的代码,它纯粹是在 flutter 中,并使用共享小部件来共享内容。
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:share/share.dart';
import 'package:uni_links/uni_links.dart';
// Share tab
enum UniLinksType { string, uri }
class SharePage extends StatelessWidget
{
SharePage(this.shareType, this.share, this.image);
final shareType;
final VideoDataModel share;
final image;
String latestLink;
Uri latestUri;
StreamSubscription sub;
UniLinksType type = UniLinksType.string;
initPlatformState() async
{
if(type == UniLinksType.string)
{
await initPlatformStateForStringUniLinks();
}
else
{
await initPlatformStateForUriUniLinks();
}
}
initPlatformStateForStringUniLinks() async
{
sub = getLinksStream().listen((String link)
{
latestLink = link ?? "Unknown";
latestUri = null;
try
{
if(link != null)
{
latestUri = Uri.parse(link);
}
}
on FormatException{}
},
onError: (err)
{
latestLink = "Failed to load latest link: $err";
latestUri = null;
});
getLinksStream().listen((String link)
{
print('got link: $link');
},
onError: (err)
{
print('got err: $err');
});
String initialLink;
Uri initialUri;
// Platform messages may fail, so we use a try/catch PlatformException.
try
{
initialLink = await getInitialLink();
print("initial link: $initialLink");
if (initialLink != null)
{
print("in if");
initialUri = Uri.parse(initialLink);
}
}
on PlatformException
{
initialLink = 'Failed to get initial link.';
initialUri = null;
}
on FormatException
{
initialLink = 'Failed to parse the initial link as Uri.';
initialUri = null;
}
}
Future initPlatformStateForUriUniLinks() async
{
sub = getUriLinksStream().listen((Uri uri)
{
latestUri = uri;
latestLink = uri?.toString() ?? 'Unknown';
},
onError: (err)
{
latestUri = null;
latestLink = 'Failed to get latest link: $err.';
});
getUriLinksStream().listen((Uri uri)
{
print('got uri: ${uri?.path} ${uri?.queryParametersAll}');
},
onError: (err)
{
print('got err: $err');
});
Uri initialUri;
String initialLink;
try
{
initialUri = await getInitialUri();
print('initial uri: ${initialUri?.path}'' ${initialUri?.queryParametersAll}');
initialLink = initialUri?.toString();
}
on PlatformException
{
initialUri = null;
initialLink = 'Failed to get initial uri.';
}
on FormatException
{
initialUri = null;
initialLink = 'Bad parse the initial link as Uri.';
}
latestUri = initialUri;
latestLink = initialLink;
return latestUri;
}
Widget shareText()
{
return Text
(
"Share",
style: TextStyle
(
fontFamily: 'Lato',
fontSize: 12.0,
fontWeight: FontWeight.w600,
letterSpacing: 0.0,
color: Colors.white
),
);
}
Widget shareTabColumn()
{
return Column
(
mainAxisAlignment:
MainAxisAlignment.center,
children: <Widget>
[
Icon
(
Icons.share,
size: 30.0,
color: Colors.white,
),
new Padding
(
padding: const EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 10.0),
),
shareText(),
],
);
}
@override
Widget build(BuildContext context)
{
return Expanded
(
child: Material
(
child: new InkWell
(
onTap: ()
{
Share.share('$shareType'+ share.id.toString() + "\n" + share.name);
initPlatformState();
},
child: shareTabColumn(),
),
color: Colors.transparent,
)
);
}
}
Run Code Online (Sandbox Code Playgroud)
在共享内容中,我想获取我的域名(例如www.example.co.in)
您不需要 firebase 来进行深度链接。您只需要按照官方文档在 iOS 和 Android 上启用深度链接即可深度链接
为了完整起见,这里提供了一个在 Android 和 IOS 上启用深度链接的代码片段。
AndroidManifest.xml
<meta-data android:name="flutter_deeplinking_enabled" android:value="true" />
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="flutterbooksample.com" />
<data android:scheme="https" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
iOS 信息.plist
<key>FlutterDeepLinkingEnabled</key>
<true/>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLName</key>
<string>flutterbooksample.com</string>
<key>CFBundleURLSchemes</key>
<array>
<string>customscheme</string>
</array>
</dict>
</array>
Run Code Online (Sandbox Code Playgroud)
然后使用url_launcher包打开url。
| 归档时间: |
|
| 查看次数: |
4158 次 |
| 最近记录: |