You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter:根据Wrap组件换行状态添加Divider组件

解决方案

方法一:通过DOM位置判断是否换行

核心思路是对比Wrap容器和Availability组件的垂直偏移量,若两者offsetTop不同,说明组件换行了。

import { useState, useEffect, useRef } from 'react';
import { Wrap, VerticalDivider, Divider, Availability } from 'your-ui-library';

function LayoutComponent() {
  const wrapRef = useRef(null);
  const availabilityRef = useRef(null);
  const [isNewLine, setIsNewLine] = useState(false);

  const checkLineStatus = () => {
    if (!wrapRef.current || !availabilityRef.current) return;
    const wrapTop = wrapRef.current.offsetTop;
    const compTop = availabilityRef.current.offsetTop;
    setIsNewLine(wrapTop !== compTop);
  };

  useEffect(() => {
    checkLineStatus();
    window.addEventListener('resize', checkLineStatus);
    return () => window.removeEventListener('resize', checkLineStatus);
  }, []);

  return (
    <Wrap ref={wrapRef}>
      {/* 前置子组件 */}
      <Availability ref={availabilityRef} />
      {isNewLine ? <Divider /> : <VerticalDivider />}
    </Wrap>
  );
}

方法二:固定断点的媒体查询

如果你的布局有明确的大屏/小屏断点(比如大屏为≥1200px),可以直接用媒体查询钩子快速实现:

import { useMediaQuery } from '@mui/material'; // 以Material UI为例,其他UI库类似

function LayoutComponent() {
  const isLargeScreen = useMediaQuery('(min-width: 1200px)');

  return (
    <Wrap>
      {/* 前置子组件 */}
      <Availability />
      {isLargeScreen ? <VerticalDivider /> : <Divider />}
    </Wrap>
  );
}

这种方式简单高效,但仅适用于布局断点固定的场景,无法适配Wrap容器自身宽度动态变化的情况。

方法三:ResizeObserver监听容器宽度

如果Wrap容器宽度不固定,可通过监听容器宽度,对比所有子组件总宽度与容器宽度的大小,判断是否会换行:

import { useState, useEffect, useRef } from 'react';
import { Wrap, VerticalDivider, Divider, Availability } from 'your-ui-library';

function LayoutComponent() {
  const wrapRef = useRef(null);
  const childRefs = useRef([]);
  const [isNewLine, setIsNewLine] = useState(false);

  const checkWrapStatus = () => {
    if (!wrapRef.current) return;
    const containerWidth = wrapRef.current.offsetWidth;
    const totalChildWidth = Array.from(childRefs.current)
      .reduce((sum, el) => sum + el.offsetWidth, 0);
    setIsNewLine(totalChildWidth > containerWidth);
  };

  useEffect(() => {
    const observer = new ResizeObserver(checkWrapStatus);
    if (wrapRef.current) observer.observe(wrapRef.current);
    checkWrapStatus();
    return () => observer.disconnect();
  }, []);

  return (
    <Wrap ref={wrapRef}>
      <div ref={el => childRefs.current[0] = el}>前置组件</div>
      <Availability ref={el => childRefs.current[1] = el} />
      {isNewLine ? <Divider /> : <VerticalDivider />}
    </Wrap>
  );
}

内容的提问来源于stack exchange,提问作者alexlipa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:10:19