Вы полагаете, что во Flutter у меня есть простой Container
, и я хотел бы изменить его размер на более высокий, например, на этом простом скриншоте я хочу изменить верхний контейнер в разделе 1
на верхний контейнер в разделе 2
и верхний контейнер. в разделе 1
должно вести себя только 100.0
после того, как размер увеличился
контейнер B
в разделе 1
и разделе 2
находятся на одной оси без изменения позиции, когда размер контейнера A
будет увеличен
например, это то, что я хочу иметь
Я не уверен, с какой анимацией я могу использовать эту функцию
этот код работает, но я не хочу этого.
Я хочу иметь перетаскиваемый нижний лист с изменяющимся радиусом границы, когда нижний лист прибыл в верхнюю часть экрана, например, с образцом видео экрана пасты и виджетом fade0n / out внутри appbar
, который находится внутри верхней части нижнего листа, который виден, когда нижний лист прибыл наверх или скрыть когда нижний лист не имеет максимального размера
import 'package:flutter/material.dart';
void main()=>runApp(SizeUp());
class SizeUp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'test',
home: SizeUpAnim(),
);
}
}
class SizeUpAnim extends StatefulWidget {
@override
State<StatefulWidget> createState() =>_SizeUpAnim();
}
class _SizeUpAnim extends State with SingleTickerProviderStateMixin {
AnimationController _controller;
// ignore: constant_identifier_names
static const _PANEL_HEADER_HEIGHT = 32.0;
bool get _isPanelVisible {
final AnimationStatus status = _controller.status;
return status == AnimationStatus.completed ||
status == AnimationStatus.forward;
}
@override
void initState() {
super.initState();
_controller = AnimationController(
duration: const Duration(milliseconds: 100), value: 1.0, vsync: this);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
elevation: 8.0,
title: const Text("Step4"),
leading: IconButton(
onPressed: () {
_controller.fling(velocity: _isPanelVisible ? -1.0 : 1.0);
},
icon: AnimatedIcon(
icon: AnimatedIcons.close_menu,
progress: _controller.view,
),
),
),
body: Column(
children: <Widget>[
Expanded(
child: LayoutBuilder(
builder: _buildStack,
),
),
Text('aaa'),
],
),
);
}
Animation<RelativeRect> _getPanelAnimation(BoxConstraints constraints) {
final double height = constraints.biggest.height;
final double top = height - _PANEL_HEADER_HEIGHT;
const double bottom = -_PANEL_HEADER_HEIGHT;
return RelativeRectTween(
begin: RelativeRect.fromLTRB(0.0, top, 0.0, bottom),
end: const RelativeRect.fromLTRB(0.0, 0.0, 0.0, 0.0),
).animate( CurvedAnimation(parent: _controller, curve: Curves.linear));
}
Widget _buildStack(BuildContext context, BoxConstraints constraints) {
final Animation<RelativeRect> animation = _getPanelAnimation(constraints);
final ThemeData theme = Theme.of(context);
return Container(
color: theme.primaryColor,
child: Stack(
children: <Widget>[
const Center(
child: Text("base"),
),
PositionedTransition(
rect: animation,
child: Material(
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16.0),
topRight: Radius.circular(16.0)),
elevation: 12.0,
child: Container(
height: _PANEL_HEADER_HEIGHT,
child: const Center(child: Text("panel")),
),
),
),
],
),
);
}
@override
void dispose() {
super.dispose();
_controller.dispose();
}
}
Column
s - person DolDurma   schedule 14.04.2020AppBar
, который отображается, когда нижний лист попадает в верхнюю часть экрана. как с экранным видео - person DolDurma   schedule 16.04.2020