android - Flutter Plaid 包在 iOS 上显示黑屏
问题描述
再会,
我有一个颤振应用程序,它集成了一个格子颤振包,它在 android 上运行良好,但在 iOS 上显示白屏。
我已经添加了
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
在 Info.plist 文件中,但这似乎无法正常工作。
下面是截图
请我需要有关如何使 iOS 平台正常工作的帮助。
这是我的配置
Configuration configuration = Configuration(
plaidPublicKey: '$PLAID_PUBLIC_KEY',
plaidBaseUrl: 'https://cdn.plaid.com/link/v2/stable/link.html',
plaidEnvironment: '$PLAID_ENV',
environmentPlaidPathAccessToken:
'https://sandbox.plaid.com/item/public_token/exchange',
environmentPlaidPathStripeToken:
'https://sandbox.plaid.com/processor/stripe/bank_account_token/create',
// plaidClientId: 'yourPlaidClientId',
// secret: plaidSandbox ? 'yourSecret' : '',
clientName: '$PLAID_CLIENT_NAME',
// webhook: 'Webhook Url',
products: 'auth, transactions',
selectAccount: 'true',
plaidClientId: null);
FlutterPlaidApi flutterPlaidApi = FlutterPlaidApi(configuration);
WidgetsBinding.instance.addPostFrameCallback((_) {
// Add Your Code here.
});
flutterPlaidApi.launch(context, (Result result) async {
// show loader screen when returning back to the app
showLoadingScreen(context, message: 'Processing...');
// send the data to the api
var response = await BankService().linkUserAccountWithSila(
accountName: result.accountName,
publicToken: result.token,
email: 'email@example.com');
final responseJson = json.decode(response.body);
if (response.statusCode >= 200 && response.statusCode <= 299) {
var token = await getToken();
var client = new http.Client();
List<String> urls = [
'getDefaultAccount',
'all',
];
try {
List<http.Response> list =
await Future.wait(urls.map((urlId) => client.get(
'$kBaseUrl/account/$urlId',
headers: {HttpHeaders.authorizationHeader: "Bearer $token"},
)));
if (list[0].statusCode == 200 && list[1].statusCode == 200) {
var defaultAccount = jsonDecode(list[0].body);
var plaidAccounts = jsonDecode(list[1].body);
Provider.of<TransferProvider>(context, listen: false)
.updatePlaidBankAccounts(
plaidAccount:
plaidAccounts['data'] != null ? plaidAccounts['data'] : [],
account: defaultAccount['data'],
);
}
} catch (e) {} finally {
client.close();
}
Navigator.pop(context);
Toast.show('Account linked successfully', context,
duration: Toast.LENGTH_LONG, gravity: Toast.CENTER);
} else {
Toast.show('Something went wrong, please try again later', context,
duration: Toast.LENGTH_LONG, gravity: Toast.CENTER);
// error
}
}, stripeToken: false);
}
解决方案
试试这个代码:https ://github.com/flutter/flutter/issues/49483 免责声明:这不是我的代码。我在这里复制它,以便如果原始帖子被删除,源代码仍然在这里可用。所有学分归原作者所有。
重现步骤
- 在 Plaid 注册一个免费的沙盒测试帐户(在沙盒中运行 webview 需要一个 public_key)
- 创建新项目并添加
plaid_screen.dart
到 lib - 在
plaid_screen.dart
将 Plaid 中的公钥分配到 queryParameters “key”键中 - 用下面的设置替换默认
main.dart
内容 - 添加
webview_flutter: ^0.3.19+5
到 pubspec.yaml - 添加
<key>io.flutter.embedded_views_preview</key><true/>
到 ios/Runner/info.plist - 运行 main.dart
主要飞镖:
import 'package:bug/plaid_screen.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
initialRoute: PlaidScreen.id,
routes: {
PlaidScreen.id: (context) => PlaidScreen(),
},
);
}
}
plaid_screen.dart:(注意:必须获取公钥并粘贴在下方)
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
String authority = 'cdn.plaid.com';
String unencodedPath = '/link/v2/stable/link.html';
Map<String, String> queryParameters = {
"key": "{{PASTE_PUBLIC_KEY}}",
"product": "auth",
"apiVersion": "v2", // set this to "v1" if using the legacy Plaid API
"env": "sandbox",
"clientName": "Test App",
"selectAccount": "true",
};
// documentation: https://plaid.com/docs/#webview-integration
class PlaidScreen extends StatefulWidget {
static const id = 'plaid_screen_id';
@override
_PlaidScreenState createState() => _PlaidScreenState();
}
class _PlaidScreenState extends State<PlaidScreen> {
Uri uri = Uri.https(authority, unencodedPath, queryParameters);
Completer<WebViewController> _controller = Completer<WebViewController>();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: WebView(
javascriptMode: JavascriptMode.unrestricted,
initialUrl: uri.toString(),
onWebViewCreated: (WebViewController webViewController) {
_controller.complete(webViewController);
},
navigationDelegate: (NavigationRequest navRequest) {
debugPrint("NavigationRequest URL: ${navRequest.url}");
if (navRequest.url.contains('plaidlink://')) {
return NavigationDecision.prevent;
}
debugPrint(navRequest.url.toString());
return NavigationDecision.navigate;
},
),
),
);
}
}
推荐阅读
- java - kubernetes pod 内存 - java gc 日志
- asp.net-core - Nlog 配置文件导致 HTTP 错误 500.30 - ANCM 进程内启动失败
- python - 根据字典的值反转字典的部分
- contiki - contiki cooja 模拟器中的 ecc 算法编译错误“cpsid i”
- android - Android Studio:单击网页视图中的超链接后如何打开新的活动?
- c# - 使用副本更改对象仍会导致源对象更改
- r - 将字符串月份转换为R中的数字
- python - 导出聊天中的批量编辑日期格式(.txt 文件)
- awk - 使用 awk 将 .deb 包依赖项转换为 graphviz .dot 图
- sql - 这些表格设置有意义吗?尝试执行特定的 SQL 查询