扑动唐';t使用setState()方法从iOS更新UI

扑动唐';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调

我使用如下平台通道从本机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未更新