美文网首页
Flutter绑定两个View,CompositedTransf

Flutter绑定两个View,CompositedTransf

作者: 旺仔_100 | 来源:发表于2021-11-25 19:58 被阅读0次
一、简介

CompositedTransformTarget 合成变换目标
CompositedTransformFollower 合成变换伴随者

举个例子,我们需要在输入框下给用户一个提示,然后页面很长,能够滚动。当我们使用TextField,然后使用overlay作为一个浮窗提示的时候,滚动界面overlay的位置不会变,需要我们动态的去计算位置。那么有没有简单的方式。

我们可以使用CompositedTransformTarget 包裹TextField,使用CompositedTransformFollower 包裹Overlay的布局,这样就可以绑定两个widget。滚动的时候就会一起滚动。

二、demo

class TipBox extends StatefulWidget {
  TipBox({Key? key}) : super(key: key);

  @override
  State<StatefulWidget> createState() {
    return TipBoxState();
  }
}

class TipBoxState extends State<TipBox> {
  final LayerLink layerLink = LayerLink();

  bool show = false;

  OverlayEntry? _overlayEntry;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: GestureDetector(
          onTap: ()=> _toggleOverlay(context),
          child: CompositedTransformTarget(
            link: layerLink,
            child: Image.asset(
              "lib/assets/dog.jpg",
              width: 80,
              height: 80,
            ),
          ),
        ),
      ),
    );
  }

  void _toggleOverlay(BuildContext context) {
    debugPrint("_toggleOverlay");
    if (!show) {
      _showOverlay(context);
    } else {
      _hideOverlay();
    }
    show = !show;
  }

  void _showOverlay(BuildContext context) {
    _overlayEntry = _createOverlayEntry();
    OverlayState? overlayState = Navigator.of(context).overlay;
    debugPrint("overlayState $overlayState");
    overlayState?.insert(_overlayEntry!);


  }

  void _hideOverlay() {
    _overlayEntry?.remove();
  }

  OverlayEntry _createOverlayEntry() => OverlayEntry(
      builder: (BuildContext context) => UnconstrainedBox(
            child: CompositedTransformFollower(
              link: layerLink,
              ///主体的位置
              followerAnchor: Alignment.bottomCenter,
              ///这个是浮窗的位置
              targetAnchor: Alignment.topCenter,
              offset: Offset(0,-5),
              child: Material(
                child: Container(
                  alignment: Alignment.center,
                  decoration: BoxDecoration(
                    color: Colors.blue,
                    borderRadius: BorderRadius.circular(5),
                  ),
                  padding: const EdgeInsets.all(10),
                  width: 50,
                  child: const Text(
                    "toly",
                    style: TextStyle(color: Colors.white),
                  ),
                ),
              ),
            ),
          ));
}


绑定控件的悬浮框.png

相关文章

网友评论

      本文标题:Flutter绑定两个View,CompositedTransf

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