Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 平移DragTableScrollableSheet上的其他元素上下移动_Flutter_Flutter Layout_Flutter Animation - Fatal编程技术网

Flutter 平移DragTableScrollableSheet上的其他元素上下移动

Flutter 平移DragTableScrollableSheet上的其他元素上下移动,flutter,flutter-layout,flutter-animation,Flutter,Flutter Layout,Flutter Animation,嗨,我必须根据DraggableScrollableSheetDraggableScrollableSheet的拖动位置来翻译我的两个小部件(你可以把这个底部的页面想象成gmap)。我必须移动/设置动画的小部件有: Text-它需要沿着一条圆弧路径同时进行前后平移和缩放。(见预期视频) 行-它需要翻译一点然后输出。来来回回 踪迹- Textwidget适当地伸缩,但以某种奇怪的方式进行翻译。(见实际视频) 行小部件淡入淡出,但很难翻译 期望视频- 实际视频- 代码- fina

嗨,我必须根据
DraggableScrollableSheet
DraggableScrollableSheet的拖动位置来翻译我的两个小部件(你可以把这个底部的页面想象成gmap)。我必须移动/设置动画的小部件有:

  • Text
    -它需要沿着一条圆弧路径同时进行前后平移和缩放。(见预期视频)
  • -它需要翻译一点然后输出。来来回回
踪迹-

  • Text
    widget适当地伸缩,但以某种奇怪的方式进行翻译。(见实际视频)

  • 小部件淡入淡出,但很难翻译

期望视频-

实际视频-

代码-

  final Duration _animationDuration = const Duration(milliseconds: 300);
  bool _isNavShown = true;
  double yValue = -35.0;
  void _applyEffectsOnDrag(double factor) {
    print(factor);
    if (factor > 0.7) {
      _isNavShown = false;
    } else {
      _isNavShown = true;
    }
  }

  Widget _getNavigationButtons(BuildContext ctx, bool isHidden) {
    return Padding(
      padding: verticalAndHorizontailPadding,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          ...[1, 2, 3]
              .map(
                (e) => Container(
                  decoration: CircleStyles.navButton,
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: [
                      Container(
                        padding: padding
                        decoration: decoration,
                        child: Icon(Icons.verified_user),
                      ),
                      SizedBox(height: AppMediaQuery(ctx).appHeight(2)),
                      Text('block heading')
                    ],
                  ),
                ),
              )
              .toList()
        ],
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        decoration: BoxDecoration(gradient: Variables.circleGradient),
        child: Stack(
          children: [
            Column(
              children: [
                Padding(
                  padding: EdgeInsets.symmetric(
                    horizontal: AppMediaQuery(context).appHorizontalPadding(4),
                  ),
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      GestureDetector(
                        onTap: () {
                          // TODO: Goto home screen
                        },
                        child: Container(
                          alignment: Alignment.center,
                          width: 32,
                          height: 32,
                          decoration: backButtonStyle,
                          child: const Icon(
                            Icons.chevron_left,
                          ),
                        ),
                      ),
                      IconButton(icon: const Icon(Icons.more_horiz), onPressed: null),
                    ],
                  ),
                ),
                TweenAnimationBuilder(
                  duration: _animationDuration,
                  curve: Curves.easeInOut,
                  tween: Tween<double>(begin: 0, end: !_isNavShown ? yValue : 0),
                  child: Padding(
                    padding: somePadding,            
                    child: const Align(
                      alignment: Alignment.centerLeft,
                      child: const Text('Circles'),
                    ),
                  ),
                  builder: (_, double dy, Widget ch) {
                    return Transform.scale(
                      scale: _isNavShown ? 1 : 0.8,
                      child: Transform.translate(
                        offset: Offset(0, dy),
                        child: ch,
                      ),
                    );
                  },
                ),
                AnimatedOpacity(
                  duration: _animationDuration,
                  opacity: _isNavShown ? 1 : 0,
                  child: _getNavigationButtons(context, true),
                ),
              ],
            ),
            NotificationListener<DraggableScrollableNotification>(
              onNotification: (obj) {
                setState(() {
                  return _applyEffectsOnDrag(obj.extent);
                });
              },
              child: DraggableScrollableSheet(
                initialChildSize: 0.6,
                minChildSize: 0.6,
                maxChildSize: 0.9,
                builder: (context, ctrl) {
                  return Container(
                    decoration: CircleStyles.sheetBase,
                    child: ConversationList(ctrl),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
final Duration\u animationDuration=const Duration(毫秒:300);
bool_isnavShowed=真;
双Y值=-35.0;
void\u应用效果拖动(双因素){
打印(系数);
如果(系数>0.7){
_IsnavShowed=false;
}否则{
_IsnavShowed=true;
}
}
小部件_getNavigationButtons(BuildContext ctx,bool isHidden){
返回填充(
填充:垂直和水平填充,
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
...[1, 2, 3]
.地图(
(e) =>容器(
装饰:CircleStyles.navButton,
子:列(
crossAxisAlignment:crossAxisAlignment.center,
儿童:[
容器(
填充:填充
装饰:装饰,,
子:图标(图标。已验证用户),
),
SizedBox(高度:AppMediaQuery(ctx).appHeight(2)),
文本('块标题')
],
),
),
)
托利斯先生()
],
),
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:容器(
装饰:框装饰(渐变:变量。圆形渐变),
子:堆栈(
儿童:[
纵队(
儿童:[
填充物(
填充:EdgeInsets.symmetric(
水平:AppMediaQuery(上下文).appHorizontalPadding(4),
),
孩子:排(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
手势检测器(
onTap:(){
//TODO:转到主屏幕
},
子:容器(
对齐:对齐.center,
宽度:32,
身高:32,
装饰:后纽扣样式,
子:常量图标(
Icons.chevron_左,
),
),
),
图标按钮(图标:常量图标(图标。更多水平线),ON按下:null),
],
),
),
TweenAnimationBuilder(
持续时间:_animationDuration,
曲线:Curves.easeInOut,
tween:tween(开始:0,结束:!\u IsnavShowed?Y值:0),
孩子:填充(
填充:一些填充,
子:const Align(
对齐:alignment.centerLeft,
子项:常量文本(“圆”),
),
),
生成器:(uzy,double dy,Widget ch){
返回变换比例(
比例:所示为1:0.8,
子:Transform.translate(
偏移量:偏移量(0,dy),
孩子:ch,,
),
);
},
),
动产能力(
持续时间:_animationDuration,
不透明度:所示为?1:0,
子项:_getNavigationButtons(上下文,true),
),
],
),
通知侦听器(
通知:(obj){
设置状态(){
返回\u applyEffectsOnDrag(对象范围);
});
},
子项:DragableScrollableSheet(
初始儿童尺寸:0.6,
minChildSize:0.6,
maxChildSize:0.9,
生成器:(上下文,ctrl){
返回容器(
装饰:圆形。床底,
子:会话列表(ctrl),
);
},
),
),
],
),
),
);
}