扑动唐';t使用setState()方法从iOS更新UI
我使用如下平台通道从本机Swift代码调用一个方法:扑动唐';t使用setState()方法从iOS更新UI,ios,swift,flutter,dart,setstate,Ios,Swift,Flutter,Dart,Setstate,我使用如下平台通道从本机Swift代码调用一个方法: channel.invokeMethod(METHOD_NAME, arguments: STRING_ARGUMENT) 在我的flatter类中,我使用回调来处理相应的方法调用 platform.setMethodCallHandler(_receiveFromHost); setMethodCallHandler()要求回调返回Future,我在Dart中的_receiveFromHost方法中设置了状态。 问题是,当Swift调
channel.invokeMethod(METHOD_NAME, arguments: STRING_ARGUMENT)
在我的flatter类中,我使用回调来处理相应的方法调用
platform.setMethodCallHandler(_receiveFromHost);
setMethodCallHandler()要求回调返回Future,我在Dart中的_receiveFromHost方法中设置了状态。
问题是,当Swift调用回调时,我的UI没有更新。为什么?
call.method
catch方法字符串,状态已设置,但UI不更新
这是我的Swift代码:
let flutterEngine = (UIApplication.shared.delegate as! AppDelegate).flutterEngine
let flutterViewController = FlutterViewController(engine: flutterEngine!, nibName: nil, bundle: nil)
let channel = FlutterMethodChannel(name: "flutter_apple_pay", binaryMessenger: flutterViewController.binaryMessenger)
channel.invokeMethod("sendDidFinishAdding", arguments: "payment success")
这是我在颤振中的代码:
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'dart:convert';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
home: new HomePage(),
);
}
}
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: const Text("Native Code from Dart"),
),
body: new MyHomePage(title: ""),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => new _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String _state = "Waiting results...";
static const platform = const MethodChannel("flutter_apple_pay");
_MyHomePageState() {
platform.setMethodCallHandler(_receiveFromHost);
}
// @override
// void initState() {
// platform.setMethodCallHandler(_receiveFromHost);
// super.initState();
// }
Future<dynamic> _receiveFromHost(MethodCall call) async {
List certificatesBase64Encoded;
String nonceBase64Encoded;
String nonceSignatureBase64Encoded;
String state;
try {
print(call.method);
if (call.method == "sendGenerateRequestWithData") {
final String data = call.arguments;
final jData = jsonDecode(data);
certificatesBase64Encoded = jData['certificatesBase64Encoded'];
nonceBase64Encoded = jData['nonceBase64Encoded'];
nonceSignatureBase64Encoded = jData['nonceSignatureBase64Encoded'];
print(certificatesBase64Encoded);
print(nonceBase64Encoded);
print(nonceSignatureBase64Encoded);
state = "sendGenerateRequestWithData";
platform.invokeMethod("SendTokenizationData", "TokenizationDataString");
} else if (call.method == "sendDidFinishAdding") {
final String result = call.arguments;
print(result);
state = result;
}
} on PlatformException catch (e) {
print(e);
}
setState(() {
_state = state;
});
print(_state);
}
Future<void> _checkCardState() async {
String cardState;
const primaryAccountIdentifiers = ["a", "b"];
try {
final String result = await platform.invokeMethod(
"checkCardState", primaryAccountIdentifiers);
cardState = result;
} on PlatformException catch (e) {
cardState = "Failed to Invoke: '${e.message}'.";
}
setState(() {
_state = cardState;
});
}
Future<void> _startApplePay() async {
const _cardNetwork = "cn/AMEX";
const _cardHolderName = "pero peric";
const _primaryAccountIdentifier = "a";
const _primaryAccountSuffix = "1234";
const _localizedDescription = "AMEX";
Map<String, dynamic> resultMap = Map();
resultMap['cardNetwork'] = _cardNetwork;
resultMap['cardHolderName'] = _cardHolderName;
resultMap['primaryAccountIdentifier'] = _primaryAccountIdentifier;
resultMap['primaryAccountSuffix'] = _primaryAccountSuffix;
resultMap['localizedDescription'] = _localizedDescription;
platform.invokeMethod("startApplePay", resultMap);
}
@override
Widget build(BuildContext context) {
return Material(
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
child: Text('Check Card State'),
onPressed: _checkCardState,
),
ElevatedButton(
child: Text('Start Apple Pay'),
onPressed: _startApplePay,
),
Text(_state),
],
),
),
);
}
}
导入“包装:颤振/材料.省道”;
导入“dart:async”;
导入“包:flifter/services.dart”;
导入“dart:convert”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
主页:新主页(),
);
}
}
类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:常量文本(“Dart的本机代码”),
),
正文:新MyHomePage(标题:),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
字符串_state=“等待结果…”;
静态常数平台=常数方法通道(“颤振苹果支付”);
_MyHomePageState(){
platform.setMethodCallHandler(_receiveFromHost);
}
//@覆盖
//void initState(){
//platform.setMethodCallHandler(_receiveFromHost);
//super.initState();
// }
Future\u receiveFromHost(MethodCall)异步{
列出证书Base64Encoded;
字符串非编码;
字符串nonceSignatureBase64Encoded;
字符串状态;
试一试{
打印(调用方法);
if(call.method==“sendGenerateRequestWithData”){
最终字符串数据=call.arguments;
最终jData=jsonDecode(数据);
certificatesBase64Encoded=jData['certificatesBase64Encoded'];
nonceBase64Encoded=jData['nonceBase64Encoded'];
nonceSignatureBase64Encoded=jData['nonceSignatureBase64Encoded'];
打印(证书base64编码);
打印(非编码);
打印(非签名Base64编码);
state=“sendGenerateRequestWithData”;
invokeMethod(“SendTokenizationData”、“TokenizationDataString”);
}else if(call.method==“senddidFinishading”){
最终字符串结果=call.arguments;
打印(结果);
状态=结果;
}
}平台上异常捕获(e){
印刷品(e);
}
设置状态(){
_状态=状态;
});
打印(_状态);
}
Future\u checkCardState()异步{
字符串状态;
常量primaryAccountIdentifiers=[“a”,“b”];
试一试{
最终字符串结果=wait platform.invokeMethod(
“checkCardState”,primaryAccountIdentifiers);
cardState=结果;
}平台上异常捕获(e){
cardState=“未能调用:'${e.message}'。”;
}
设置状态(){
_state=cardState;
});
}
Future\u startaplepay()异步{
const_cardNetwork=“cn/AMEX”;
const_cardiname=“pero peric”;
const_primarycountidentifier=“a”;
const_primarycountsuffix=“1234”;
const_localizedDescription=“美国运通”;
Map resultMap=Map();
结果映射['cardNetwork']=\u cardNetwork;
结果映射['CardingName']=\u CardingName;
结果映射['primaryAccountIdentifier']=\u primaryAccountIdentifier;
结果映射['primaryAccountSuffix']=\u primaryAccountSuffix;
结果映射['localizedDescription']=\u localizedDescription;
平台调用方法(“StarTaplePay”,结果映射);
}
@凌驾
小部件构建(构建上下文){
退货(
儿童:中心(
子:列(
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
升降按钮(
子项:文本(“检查卡状态”),
onPressed:_checkCardState,
),
升降按钮(
子项:文本('Start Apple Pay'),
按下按钮:_startaplepay,
),
文本(_状态),
],
),
),
);
}
}
谢谢 可能您的
调用.method
没有传递\u receivefromhost
中的任何if
语句。print(call.method)
的输出是什么?@Andrej当它通过时,状态已设置,但UI未更新