Flutter中的组件 : OpenContainer

124 阅读3分钟

Flutter中的组件 : OpenContainer

OpenContainer

是 Flutter Material 组件库中一个强大的 容器过渡动画组件,专门用于实现 从一个小容器(如卡片)平滑展开到全屏页面,再收缩返回 的视觉效果。它通过动画将两个不同尺寸的 UI 状态无缝连接,常用于创建符合 Material Design 规范的交互场景(如点击卡片跳转详情页)。 animations包中的组件。

OpenContainer({
  Key? key,
  Color closedColor = Colors.white,
  Color openColor = Colors.white,
  Color? middleColor,
  double closedElevation = 1.0,
  double openElevation = 4.0,
  ShapeBorder closedShape = const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(4.0))),
  ShapeBorder openShape = const RoundedRectangleBorder(),
  void Function(Object?)? onClosed,
  required Widget Function(BuildContext, void Function()) closedBuilder,
  required Widget Function(BuildContext, void Function({Object? returnValue})) openBuilder,
  bool tappable = true,
  Duration transitionDuration = const Duration(milliseconds: 300),
  ContainerTransitionType transitionType = ContainerTransitionType.fade,
  bool useRootNavigator = false,
  RouteSettings? routeSettings,
  Clip clipBehavior = Clip.antiAlias,
})
属性类型默认值作用
closedColorColorColors.white闭合状态(小容器)的背景色
openColorColorColors.white展开状态(全屏)的背景色
middleColorColor?null过渡动画中间的背景色(可选)
closedShapeShapeBorder圆角矩形闭合时的形状(如圆角卡片)
openShapeShapeBorder矩形展开时的形状(通常全屏无圆角)
closedElevationdouble1.0闭合状态的阴影深度(类似卡片阴影)
openElevationdouble4.0展开状态的阴影深度
closedBuilderWidget Function(BuildContext, void Function())构建闭合状态的UI,参数含触发展开的回调(如按钮点击调用它)
openBuilderWidget Function(BuildContext, void Function({Object? returnValue}))构建展开全屏的UI,参数含关闭回调(可带返回值)
tappablebooltrue是否允许点击闭合容器触发展开
onClosedFunction(Object?)null关闭动画完成后的回调(接收openBuilder返回的值)
transitionDurationDuration300ms动画持续时间
transitionTypeContainerTransitionTypefade动画类型: • fade(淡入淡出+缩放) • fadeThrough(交叉淡入淡出)
clipBehaviorClipClip.antiAlias内容裁剪方式(抗锯齿)
useRootNavigatorboolfalse是否使用根导航器(处理深层导航栈时有用)
routeSettingsRouteSettings?null自定义路由设置(如命名路由参数)

实际用法

///绘制tiem
  _renderItem(e) {
    ReposViewModel reposViewModel = ReposViewModel.fromTrendMap(e);
    return OpenContainer(
      closedColor: Colors.transparent,
      closedElevation: 0,
      transitionType: ContainerTransitionType.fade,
      openBuilder: (BuildContext context, VoidCallback _) {
        // 测试
        print("就是这里实现的,啦啦啦");
        return NavigatorUtils.pageContainer(
            RepositoryDetailPage(
                reposViewModel.ownerName!, reposViewModel.repositoryName!),
            context);
      },
      tappable: true,
      closedBuilder: (BuildContext _, VoidCallback openContainer) {
        return ReposItem(reposViewModel, onPressed: null);
      },
    );
  }

效果

OpenContainer.gif

项目应用实例:

OpenContainer(
  closedColor: Colors.transparent,
  openColor: Colors.transparent,
  closedElevation: 0,
  closedShape: const RoundedRectangleBorder(
    borderRadius: BorderRadius.all(Radius.circular(0)),
  ),
  openElevation: 0,
  transitionDuration: const Duration(milliseconds: 300),
  closedBuilder: (context, action) {
    return GestureDetector(
      onTap: action,
      child: Container(
        alignment: Alignment.center,
        width: ScreenAdapter.width(144),
        height: ScreenAdapter.height(35),
        decoration: BoxDecoration(
          border: Border.all(
            color: const Color.fromRGBO(0, 0, 0, 1),
            width: ScreenAdapter.width(1),
          ),
          borderRadius: BorderRadius.circular(ScreenAdapter.radius(55)),
          color: Colors.transparent,
        ),
        child: Text(
          "编辑个人资料",
          textAlign: TextAlign.center,
          style: TextStyle(
            fontWeight: FontWeight.bold,
            fontSize: ScreenAdapter.fontSize(14),
            color: const Color.fromRGBO(0, 0, 0, 1),
          ),
        ),
      ),
    );
  },
  openBuilder: (context, action) {
    Get.put(EditProfileController());
    return EditProfileView();
  },
),

特别感谢学习项目来源:CarGuo/gsy_github_app_flutter: Flutter 超完整的开源项目,功能丰富,适合学习和日常使用。GSYGithubApp系列的优势:我们目前已经拥有Flutter、Weex、ReactNative、kotlin 四个版本。 功能齐全,项目框架内技术涉及面广,完成度高,持续维护,配套文章,适合全面学习,对比参考。跨平台的开源Github客户端App,更好的体验,更丰富的功能,旨在更好的日常管理和维护个人Github,提供更好更方便的驾车体验Σ( ̄。 ̄ノ)ノ。同款Weex版本 : https://github.com/CarGuo/GSYGithubAppWeex 、同款React Native版本 : https://github.com/CarGuo/GSYGithubApp 、原生 kotlin 版本 https://github.com/CarGuo/GSYGithubAppKotlin