在安装和实施Flutter 团队提供的应用内购买插件后,我遇到了一个问题。到目前为止我做了什么:
InAppPurchaseConnection.enablePendingPurchases();在应用启动时添加bool available = await _iap.isAvailable();
if (!available) {
print('=========> The store cannot be reached or accessed.');
} else {
Set<String> _kIds = {'farm', 'forest'};
ProductDetailsResponse productsResponse = await _iap.queryProductDetails(_kIds);
List<ProductDetails> products = productsResponse.productDetails;
}
}
Run Code Online (Sandbox Code Playgroud)
queryProductDetails每次都崩溃并显示以下日志:E/AndroidRuntime( 9053): java.lang.NoSuchMethodError: No virtual method getIntroductoryPriceCycles()Ljava/lang/String; in class Lcom/android/billingclient/api/SkuDetails; or its super classes (declaration of 'com.android.billingclient.api.SkuDetails' appears in /data/app/com.my.fancy.app-6ImcBn8ELPgiO8hTXXp_3Q==/base.apk)
E/AndroidRuntime( 9053): at io.flutter.plugins.inapppurchase.Translator.fromSkuDetail(Translator.java:27)
E/AndroidRuntime( 9053): at …Run Code Online (Sandbox Code Playgroud) Chrome Custom Tabs我有一个项目,客户被重定向以完成在应用程序内浏览器(在 Android 或SFSafariViewControlleriOS 上)中打开的银行网址上的付款请求。应用程序已编写Flutter,我们使用flutter_inappwebview来实现此目的。完成购买有2条路径:
银行应用程序存在,项目可以打开该银行应用程序并在那里完成付款。成功退货是通过使用 Android 的应用程序链接和 iOS 的通用链接来实现的。这个流程运行得很好。
没有银行应用程序,用户会看到Chrome Custom Tabs或SFSafariViewController,他需要完成由几个屏幕组成的整个支付流程(输入银行信息的步骤,然后验证密码或短信,最后是成功屏幕)。最后一个屏幕是在打开的 url 中找到“重定向 url”的屏幕(url 的参数之一,而不是整个 url)。
当使用 WebView(该插件中的 InAppBrowser 类)时,有一个回调,onLoadStop我可以在其中识别重定向并监视在支付的最后一个屏幕上重定向时是否找到此“返回网址”。如果Chrome Custom Tabs这样SFSafariViewController的回调不存在,我不确定如何识别此“reutrn url”的存在,并在看到它时采取行动关闭应用内浏览器并执行显示个性化用户消息“您有”的操作成功完成您的购买”。有什么想法可以做到这一点吗?
即使您不知道 flutter,任何关于如何在本机代码中实现这一点的帮助都将有助于了解更多信息是否可能,以及本机应用程序如何处理这种情况。
android ios chrome-custom-tabs sfsafariviewcontroller flutter
到目前为止我所拥有的是这样的:
我已经定义了typealias完成处理程序
typealias UserCompletionHandler = (_ object: User?, _ error: ApiError?) -> Void
Run Code Online (Sandbox Code Playgroud)
我创建了一个使用此类型别名的服务函数
func login(email: String, password: String, completion: UserCompletionHandler) {
// ...
// this part here handles API call and parsing logic
// ...
completion(user, nil)
}
Run Code Online (Sandbox Code Playgroud)
我想要实现的是通过引入命名参数来获得更具可读性的带有参数的完成回调。想法是这样结束:
completion(object: user, error: nil)
Run Code Online (Sandbox Code Playgroud)
或者甚至更好地将错误参数设置为可选,这样我就可以调用
completion(object: user)
Run Code Online (Sandbox Code Playgroud)
问题是我找不到改变typealias定义的方法来实现这一点。
这里和这里已经有 2 个关于这个主题的未答复的帖子,没有人为这个问题提供有效的解决方案。
第一张图片显示了搜索控制器的 iOS 10 行为,您可以在其中看到左侧的层次结构和右侧的红色框内的搜索控制器框架。中心蓝色的视图是表中正确显示的视图。

第二张图显示了 iOS 11 的行为,其中搜索控制器退出标题边界tableView,并移动到屏幕顶部,这是没有意义的,因为表格视图位于距屏幕顶部 230 像素的位置。

我用来显示所有这些的代码如下(在 中viewDidLoad):
self.definesPresentationContext = YES;
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.searchBar.delegate = self;
self.searchController.searchBar.clipsToBounds = YES;
self.tableView.tableHeaderView = self.searchController.searchBar;
self.searchController.searchBar.placeholder = @"Enter name or email";
[self.searchController.searchBar sizeToFit];
Run Code Online (Sandbox Code Playgroud) 我的 Flutter 应用程序中有 API 通信服务,其中包含 10 多个不同的服务,以及 100 多个需要解析数据的 API 调用。为了重用代码,我决定创建一些通用的解析代码来解析来自 API 的数据:
ApiResponse handleObjectResponse({
@required http.Response serverResponse,
@required Function objectConstructor,
}) {
if (serverResponse.statusCode == 200) {
dynamic responseObject = objectConstructor(json.decode(serverResponse.body));
return ApiResponse(responseObject: responseObject);
} else {
ApiError error = responseHasError(serverResponse.body);
return ApiResponse(error: error);
}
}
Run Code Online (Sandbox Code Playgroud)
这样我就能够以可重用的方式从 API 解析 JSON 对象,无论 Object 类是什么,只需将构造函数传递给此方法即可。
当我在我为获取数据而创建的任何服务中调用此方法时,如下所示:
handleObjectResponse(serverResponse: response, objectConstructor: ChartData.fromJson);
Run Code Online (Sandbox Code Playgroud)
我收到错误:The getter 'fromJson' isn't defined for the class 'ChartData'.
Try importing the library that defines 'fromJson', correcting the name to …
flutter ×3
ios ×3
android ×2
constructor ×1
java ×1
objective-c ×1
swift ×1
type-alias ×1
uisearchbar ×1
uitableview ×1