zhaobinglong / myBlog

https://zhaobinglong.github.io/myBlog/
MIT License
7 stars 0 forks source link

youwallet钱包开发过程中的碎碎念 #20

Open zhaobinglong opened 4 years ago

zhaobinglong commented 4 years ago

仓库地址

https://github.com/youwallet/wallet

DEX

DEX是一种去中心化的交换,本质上是一种新型的配对匹配,允许人们在没有中介机构管理分类账或控制用户资金的情况下下单和交易加密货币。 颇具讽刺意味的是,现在知名的交易所,都是中心化交易所,他们会获取你的信息,管理你的帐户,并且容易受到缓慢或直接攻击。为了进入一个去中心化的生态系统,却必须信任一个集中的机构。

DeFi(去中心化金融)

资讯社区

http://www.btb8.com/

交易所

coinbase:https://www.coinbase.com/

参考

以太坊测试网:https://ropsten.etherscan.io/ JSONRPC的调用过程: https://ethereum.gitbooks.io/frontier-guide/content/rpc.html

gasnow获取当前以太坊gas

获取 GasPrice 报价。接口数据每 8s 更新一次,请控制访问频率,频率太高会被拉黑名单;已部署负载均衡,https://www.gasnow.org/

Request
中国大陆: GET https://gasnow.sparkpool.com/api/v3/gas/price?utm_source=:YourAPPName
国际: GET https://www.gasnow.org/api/v3/gas/price?utm_source=:YourAPPName
Parameters

* utm_source String. Your app name (e.g. imToken)
Response Example

{
  "code": 200,
  "data": {
    "rapid": 180132000000, wei
    "fast": 177000000000,
    "slow": 150000000000,
    "standard": 109000001459,
    "timestamp": 1598434638872,
  }
}
zhaobinglong commented 4 years ago

全局事件总线

在APP中,我们经常会需要一个广播机制,用以跨页面事件通知,比如一个需要登录的APP中,页面会关注用户登录或注销事件,来进行一些状态更新。这时候,一个事件总线便会非常有用,事件总线通常实现了订阅者模式,订阅者模式包含发布者和订阅者两种角色,可以通过事件总线来触发事件和监听事件可以在任意页面的业务逻辑中广播事件,目标页面需要提前在initState生命周期中注册监听该事件的名字

实例


// 新建bus.dart, 注册定义事件,这里利用了event_bus这个插件
import 'package:event_bus/event_bus.dart';
EventBus eventBus = EventBus();
class TokenListUpdateEvent {
  TokenListUpdateEvent();
}

// 在A页面广播
eventBus.fire(TokenListUpdateEvent());

// 在B页面监听
@override // override是重写父类中的函数
void initState() {
    eventBus.on<TokenListUpdateEvent>().listen((event) async {
       // do anything
    });
}
zhaobinglong commented 4 years ago

异步函数之Future

Future与JavaScript中的Promise非常相似,表示一个异步操作的最终完成(或失败)及其结果值的表示。简单来说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作。一个Future只会对应一个结果,要么成功,要么失败。

由于本身功能较多,这里我们只介绍其常用的API及特性。还有,请记住,Future 的所有API的返回值仍然是一个Future对象,所以可以很方便的进行链式调用。

应用实例

Future.delayed(new Duration(seconds: 2),(){
   //return "hi world!";
   throw AssertionError("Error");
}).then((data){
   //执行成功会走到这里 
   print(data);
}).catchError((e){
   //执行失败会走到这里   
   print(e);
}).whenComplete((){
   //无论成功或失败都会走到这里
});
zhaobinglong commented 4 years ago

异步函数之stream

Stream 也是用于接收异步事件数据,和Future 不同的是,它可以接收多个异步操作的结果(成功或失败)。 也就是说,在执行异步任务时,可以通过多次触发成功或失败事件来传递结果数据或错误异常。 Stream 常用于会多次读取数据的异步任务场景,如网络内容下载、文件读写等。举个例子:

Stream.fromFutures([
  // 1秒后返回结果
  Future.delayed(new Duration(seconds: 1), () {
    return "hello 1";
  }),
  // 抛出一个异常
  Future.delayed(new Duration(seconds: 2),(){
    throw AssertionError("Error");
  }),
  // 3秒后返回结果
  Future.delayed(new Duration(seconds: 3), () {
    return "hello 3";
  })
]).listen((data){
   print(data);
}, onError: (e){
   print(e.message);
},onDone: (){

});
zhaobinglong commented 4 years ago

生命周期

image

initState

当插入渲染树的时候调用,这个函数在生命周期中只调用一次。这里可以做一些初始化工作,比如初始化State的变量。

didChangeDependencies

这个函数会紧跟在initState之后调用,并且可以调用BuildContext.inheritFromWidgetOfExactType,那么BuildContext.inheritFromWidgetOfExactType的使用场景是什么呢?最经典的应用场景是

didUpdateWidget

deactivate

/// Called when this object is removed from the tree. 在dispose之前,会调用这个函数。

dispose

/// Called when this object is removed from the tree permanently. 一旦到这个阶段,组件就要被销毁了,这个函数一般会移除监听,清理环境。

页面切换中的时序

Widget A打开Widget B: Navigator.push(B)

B构造函数--->B initState--->B didChangeDependencies--->B build--->A deactive--->A didChangeDependencies.

Widget B退出: Navigator.pop

A deactive--->A didChangeDependencies--->A build--->B deactive--->B dispose

可以看出, Flutter打开、关闭Widget时跟安卓、iOS的时序一样, 都是先处理即将显示的界面。再处理被关闭的页面

zhaobinglong commented 4 years ago

两种State

StatelessWidget

一个 StatelessWidget 是不能被改变的,比如:Icon、Text等。如果你的控件一旦显示,就不需要再做任何的变更,那么你应该使用 StatelessWidget。

class MyWidget extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return _buildMyWidget(context);
  }
zhaobinglong commented 4 years ago

运营日志主动上报

在同步代码中,执行

// 使用 try-catch 捕获同步异常
try {
  throw StateError('This is a Dart exception.');
}
catch(e) {
  print(e);
}

// 使用 catchError 捕获异步异常
Future.delayed(Duration(seconds: 1))
    .then((e) => throw StateError('This is a Dart exception in Future.'))
    .catchError((e)=>print(e));

// 注意,以下代码无法捕获异步异常
try {
  Future.delayed(Duration(seconds: 1))
      .then((e) => throw StateError('This is a Dart exception in Future.'))
}
catch(e) {
  print("This line will never be executed. ");
}
zhaobinglong commented 4 years ago

flutter解析html中的数据(爬虫)

需要用到html包

    String url = 'https://github.com/youwallet/wallet/tags';
    var response = await new Dio().get(url);
    var document = parse(response.data);
    // var app = document.querySelector(".commit-title").querySelectorAll("a");
    List<Element> app = document.querySelectorAll('.commit-title > a');
    // print('app====>${app}');
    var data = List.generate(app.length, (i) {
      // return app[i].attributes['href'];
      return app[i].innerHtml;
    });
    return data[0];
zhaobinglong commented 4 years ago

导航栏红点提示

参考

https://blog.csdn.net/liu__520/article/details/84138767