flutter - 每次用户使用来自 firebase 的动态链接的应用程序安装我的应用程序时,我如何检测和奖励?
问题描述
我尝试在我的应用程序中添加动态链接。首先,我将 firebase 动态链接包添加到我的应用程序中,并进行了所有 firebase 配置。
我的最终目标是给分享链接的用户一个礼物,每次安装都用他的分享链接完成
这是我当前的实现,它为点击链接的用户赠送礼物,但不(我认为)为共享链接的用户赠送礼物。
class parrainage extends StatefulWidget {
@override
_parrainageState createState() => _parrainageState();
}
class _parrainageState extends State<parrainage> {
int referral_gift=0;
String _linkMessage;
bool _isCreatingLink = false;
String _testString =
"Fais un appuis long sur le lien pour le copier";
@override
void initState() {
super.initState();
initDynamicLinks();
}
void initDynamicLinks() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
referral_gift = prefs.getInt('referral_gift')??0;
FirebaseDynamicLinks.instance.onLink(
onSuccess: (PendingDynamicLinkData dynamicLink) async {
final Uri deepLink = dynamicLink?.link;
if (deepLink != null) {
Navigator.pushNamed(context, deepLink.path);
referral_gift=referral_gift+1;
prefs.setInt('referral_gift', referral_gift);
}
}, onError: (OnLinkErrorException e) async {
print('onLinkError');
print(e.message);
});
final PendingDynamicLinkData data =
await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;
if (deepLink != null) {
Navigator.pushNamed(context, deepLink.path);
referral_gift=referral_gift+1;
prefs.setInt('referral_gift', referral_gift);
}
}
Future<void> _createDynamicLink(bool short) async {
setState(() {
_isCreatingLink = true;
});
final DynamicLinkParameters parameters = DynamicLinkParameters(
uriPrefix: 'https://XXXXX.page.link/XXXX',
link: Uri.parse('https://XXXXXXXX.page.link/'),
androidParameters: AndroidParameters(
packageName: 'XXXXXXXXXXXXX',
minimumVersion: 0,
),
dynamicLinkParametersOptions: DynamicLinkParametersOptions(
shortDynamicLinkPathLength: ShortDynamicLinkPathLength.short,
),
iosParameters: IosParameters(
bundleId: 'XXXXXXXXXXXXX',
minimumVersion: '0',
),
socialMetaTagParameters: SocialMetaTagParameters(
title: 'XXXXXXX',
description: 'Débloque une fonction premium',
),
);
Uri url;
if (short) {
final ShortDynamicLink shortLink = await parameters.buildShortLink();
url = shortLink.shortUrl;
} else {
url = await parameters.buildUrl();
}
setState(() {
_linkMessage = url.toString();
_isCreatingLink = false;
});
}
@override
Widget build(BuildContext context) {
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(20.0))),
title: Text(("Parrainage"),textAlign: TextAlign.center, style: TextStyle(color: Colors.black, fontWeight: FontWeight.w600, fontSize: SizeConfig.safeBlockHorizontal * 7.0)),
content:
Padding(
padding: const EdgeInsets.all(16),
child:
new Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
new Text("XXXXXX",textAlign: TextAlign.center, style: TextStyle(color: Colors.black, fontWeight: FontWeight.w400, fontSize: SizeConfig.safeBlockHorizontal * 4)),
new Text("$referral_gift",textAlign: TextAlign.center, style: TextStyle(color: Colors.black, fontWeight: FontWeight.w800, fontSize: SizeConfig.safeBlockHorizontal * 5)),
new RaisedButton(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
elevation: 5,
highlightElevation: 10,
color:Color(0xffff9a7b),
splashColor: Color(0xffff9a7b),
child : Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
new Text("Créer un lien",textAlign: TextAlign.center, style: TextStyle(color: Colors.white, fontWeight: FontWeight.w800, fontSize: SizeConfig.safeBlockHorizontal * 5)),
new Container (
padding: const EdgeInsets.only(left:0),
child: new Icon(
Icons.arrow_forward_ios,
color: Colors.white,
size: 20.0,
),),
],
),
padding: const EdgeInsets.all (15.0),
onPressed:
!_isCreatingLink
? () => _createDynamicLink(false)
: null,
),
InkWell(
child: Text(
_linkMessage ?? '',
style: const TextStyle(color: Colors.blue),
),
onTap: () async {
if (_linkMessage != null) {
await launch(_linkMessage);
}
},
onLongPress: () {
Clipboard.setData(ClipboardData(text: _linkMessage));
Scaffold.of(context).showSnackBar(
const SnackBar(content: Text("Lien copié, plus qu'à le partager")),
);
},
),
Text(_linkMessage == null ? '' : _testString)
]
),
),
);
}
}
解决方案
我建议您在应用程序中添加 firebase 身份验证,并且您可以不在本地管理服务器上的点,因为您使用的是共享首选项,它只会存储数据,直到应用程序安装并不总是如此。应用程序卸载后,用户获得的所有积分将被删除或等于 0 。
推荐阅读
- python - 如何从打印中导出txt文件
- css - Calc() 像素高度动态地基于 CSS 的动态宽度和比例
- zipline - Zipline 是否支持 Renko Chart?
- asp.net-identity - 登录成功返回但用户不是
- c++ - 无法在具有恒定可变大小的类中创建堆栈分配数组
- pandas - 根据pandas中两列的组合比较两个数据框
- c# - AnimationNavigationPage 只是从左向右滑动而不是从右向左滑动
- sql - 使用可为空参数在 SQL 中过滤具有可为空字段的记录的优雅方法
- c++ - 带有条件语句的 CPP 有趣的事情
- python - 如何在python中获得前100个没有重复值的素数?