Dart中compute函数内访问BIP32变量返回null的问题
Dart中compute调用无法访问BIP32实例的问题解决
问题根源
Dart的compute函数会创建独立的Isolate,每个Isolate拥有完全独立的内存空间,主Isolate中的全局变量不会共享给新Isolate。你在主Isolate里给root赋值后,checkRoot所在的新Isolate里的root是未初始化的null,所以打印结果为null。
解决方案
方案1:将BIP32实例(或可重建实例的参数)作为参数传递给compute
compute支持传递可序列化的参数,你可以把root或者能重建它的信息(比如扩展私钥字符串)作为参数传入checkRoot:
如果BIP32实例支持跨Isolate传递(实现了序列化接口),可以直接传实例:
Map checkRoot(Map args) { BIP32 root = args['root']; print(root); // 输出 Instance of BIP32 } Future<void> initializeAllPrivateKeys(String mnemonic) async { Map seedDetails = await compute(calculateSeed, mnemonic); root = seedDetails['root']; seed = seedDetails['seed']; print(root); // 'Instance of BIP32' await compute(checkRoot, {'root': root}); }
如果BIP32实例无法直接跨Isolate传递,可先转成Base58字符串,在checkRoot中重建实例:
Map checkRoot(String extendedPrivKey) { BIP32 root = bip32.BIP32.fromBase58(extendedPrivKey); print(root); // 输出 Instance of BIP32 } Future<void> initializeAllPrivateKeys(String mnemonic) async { Map seedDetails = await compute(calculateSeed, mnemonic); root = seedDetails['root']; seed = seedDetails['seed']; print(root); // 'Instance of BIP32' await compute(checkRoot, root.toBase58()); }
方案2:直接调用checkRoot,不使用compute
如果checkRoot不需要在独立Isolate中执行,直接在主Isolate里调用即可,这样能直接访问全局变量root:
Future<void> initializeAllPrivateKeys(String mnemonic) async { Map seedDetails = await compute(calculateSeed, mnemonic); root = seedDetails['root']; seed = seedDetails['seed']; print(root); // 'Instance of BIP32' checkRoot(''); // 直接调用,无需compute }
内容的提问来源于stack exchange,提问作者Davy King
相关产品推荐
相关产品推荐

