美文网首页
2022-09-30 GetBuilder

2022-09-30 GetBuilder

作者: 我是小胡胡分胡 | 来源:发表于2022-09-29 16:59 被阅读0次

    GetBuilder

    StatefullWidget

    1、StatefullWidget

    void initState() {
        // _GetBuilderState._currentState = this;
        super.initState();
        widget.initState?.call(this);
    
        var isRegistered = GetInstance().isRegistered<T>(tag: widget.tag); //获取GetxController
    
        if (widget.global) {
          if (isRegistered) {
            if (GetInstance().isPrepared<T>(tag: widget.tag)) {
              _isCreator = true;
            } else {
              _isCreator = false;
            }
            controller = GetInstance().find<T>(tag: widget.tag); //获取GetxController
          } else {
            controller = widget.init;
            _isCreator = true;
            GetInstance().put<T>(controller!, tag: widget.tag);//获取GetxController
          }
        } else {
          controller = widget.init; //创建GetxController
          _isCreator = true;
          controller?.onStart();
        }
    
        if (widget.filter != null) {
          _filter = widget.filter!(controller!);
        }
    
        _subscribeToController(); // 进入第2步
      }
    

    2、 GetxController 绑定

      void _subscribeToController() {
        _remove?.call();
        _remove = (widget.id == null)
            ? controller?.addListener( //添加update
                _filter != null ? _filterUpdate : getUpdate,
              )
            : controller?.addListenerId(
                widget.id,
                _filter != null ? _filterUpdate : getUpdate,
              );
      }
    
    
    // update,调用setState 刷新界面
     void getUpdate() {
        if (mounted) setState(() {});
      }
    
    
    //GetXcontroller 添加update
    
      Disposer addListener(GetStateUpdate listener) {
        assert(_debugAssertNotDisposed());
        _updaters!.add(listener); // 添加update
        return () => _updaters!.remove(listener);
      }
    

    3、 GetXcontroller 调用 update 刷新statefullWidget

    
    //在logic 中调用update 
      void update([List<Object>? ids, bool condition = true]) {
        if (!condition) {
          return;
        }
        if (ids == null) {
          refresh(); //继续下一步
        } else {
          for (final id in ids) {
            refreshGroup(id);
          }
        }
      }
    
      void refresh() {
        assert(_debugAssertNotDisposed());
    
        /// This debounce the call to update.
        /// It prevent errors and duplicates builds
        // if (_microtask == _version) {
        //   _microtask++;
        //   scheduleMicrotask(() {
        //     _version++;
        //     _microtask = _version;
        _notifyUpdate(); //继续下一步
        // });
        // }
      }
    
    
     void _notifyUpdate() { //到这里刷新
        for (var element in _updaters!) { //看到这个 _updaters 了没,对应就是 StateufullWidget的getUpdate 方法
          element!();
        }
      }
    

    相关文章

      网友评论

          本文标题:2022-09-30 GetBuilder

          本文链接:https://www.haomeiwen.com/subject/lsfrartx.html