Flutter 颤振抽屉动画曲线

Flutter 颤振抽屉动画曲线,flutter,flutter-animation,flutter-scaffold,Flutter,Flutter Animation,Flutter Scaffold,有没有办法向颤振脚手架抽屉添加曲线?例如Curves.ElasticOut 我考虑过扩展Drawer或DrawerControllerState类来创建一个允许曲线输入的自定义版本,但是似乎没有一种明显的方法可以做到这一点 有一个有用的插件,它使用自己的侧菜单类提供曲线功能,但我想使用scaffold drawer来实现这一点,因为它似乎不应该是一个困难的扩展 (可选插件) 我已经研究了现有的SO问题,找不到与此主题重复的问题,但这是我第一次提出有关堆栈溢出的问题,因此,如果我在这里犯了任何错误

有没有办法向颤振脚手架抽屉添加曲线?例如Curves.ElasticOut

我考虑过扩展Drawer或DrawerControllerState类来创建一个允许曲线输入的自定义版本,但是似乎没有一种明显的方法可以做到这一点

有一个有用的插件,它使用自己的侧菜单类提供曲线功能,但我想使用scaffold drawer来实现这一点,因为它似乎不应该是一个困难的扩展 (可选插件)


我已经研究了现有的SO问题,找不到与此主题重复的问题,但这是我第一次提出有关堆栈溢出的问题,因此,如果我在这里犯了任何错误,我深表歉意。

我尝试了更多关于您想做什么的内容,但我当然做不到。 但我用不同的动画创建了自定义抽屉。在这里,您可以给出您的
持续时间
曲线
。 那个么它是不是比你们想创造的更复杂、更漂亮呢。 以下是源代码和解释:

首先,我们需要创建两个有状态的小部件,
CustomDrawer
HomeScreem
: 在创建这个小部件之后,我们需要创建
包装器
小部件,它将控制我们的屏幕更改

  • 包装器
    小部件:
类包装扩展了无状态小部件{
常量包装器({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回堆栈(
儿童:[
CustomDrawer(),
主屏幕(),
],
);
}
}
然后我们必须创建
CustomDrawer
小部件:

  • CustomDrawer
    小部件:
类CustomDrawer扩展StatefulWidget{
@凌驾
_CustomDroperState createState()=>\u CustomDroperState();
}
类_CustomDrawerState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:颜色(0xffD53437),
主体:堆栈(
儿童:[
///在这里加上你想要的。。
世界其他地区(儿童:[]),
],
),
);
}
}
好的,是时候创建
主屏幕
小部件来管理动画了。所以我们要做的一切都在这里。 这里我们需要创建一个有状态的wideget并返回
AnimatedContainer
。如你所见:

类主屏幕扩展StatefulWidget{
常量主屏幕({Key}):超级(Key:Key);
@凌驾
_HomeScreenState createState()=>\u HomeScreenState();
}
类_homescrenstate扩展状态{
@凌驾
小部件构建(构建上下文){
返回动画容器(
颜色:颜色。灰色[900],
子级:buildScaffold(),
);
}
Widget buildScaffold(){
返回脚手架(
appBar:buildCustomAppBar(),
背景颜色:颜色。黑色54,
正文:中(
子项:文本(“曲线抽屉示例”),
)
);
}
现在我们要做一些方法和计算来管理我们的屏幕。 首先在下至
\u homescrenstate
上创建此变量:

double x=0;
双y=0;
双s=1;
bool_isDrawerOpened=false;
int _currentIndex=0;
然后我们需要两种方法,
openDrawer
closeDrawer

  • 首先是
    openDrawer
void openDrawer(){
设置状态(){
x=250;
y=150;
s=0.6;
_isDrawerOpened=true;
});
}
  • 第二个是
    closeDrawer
void closeDrawer(){
设置状态(){
x=0;
y=0;
s=1;
_isDrawerOpened=false;
});
}
还有时间填充我们的
AnimatedContainer
,以进行do更改:

  • 我们的
    AnimatedContainer
    填充后:
AnimatedContainer(
颜色:颜色。灰色[900],
曲线:Curves.easeInOutBack,
变换:矩阵4.变换值(x,y,0)…比例,
持续时间:持续时间(秒数:1),
子级:buildScaffold(),
);
现在我们需要appBar来使用我们的方法,所以对于
openDrawer
closeDrawer

AppBar buildCustomAppBar(){
返回AppBar(
背景颜色:Colors.black,
领先:IconButton(
图标:图标(
_isDrawerOpened?图标。清除:图标。菜单,
颜色:颜色,白色,
),
按下时:_被打开?关闭抽屉:打开抽屉,
),
);
}
如果您完成了这些步骤,那么您就可以使用并享受了!只需将
包装器
放入main.dart>MaterialApp的主页即可

  • 主屏幕的完整代码
类主屏幕扩展StatefulWidget{
常量主屏幕({Key}):超级(Key:Key);
@凌驾
_HomeScreenState createState()=>\u HomeScreenState();
}
类_homescrenstate扩展状态{
final pageController=pageController();
双x=0;
双y=0;
双s=1;
bool_isDrawerOpened=false;
int _currentIndex=0;
void openDrawer(){
设置状态(){
x=250;
y=150;
s=0.6;
_isDrawerOpened=true;
});
}
空抽屉(){
设置状态(){
x=0;
y=0;
s=1;
_isDrawerOpened=false;
});
}
@凌驾
小部件构建(构建上下文){
返回动画容器(
颜色:颜色。灰色[900],
曲线:Curves.easeInOutBack,
变换:矩阵4.变换值(x,y,0)…比例,
持续时间:持续时间(秒数:1),
子级:buildScaffold(),
);
}
Widget buildScaffold(){
返回脚手架(
appBar:buildCustomAppBar(),
背景颜色:颜色。黑色54,
正文:中(
子项:文本(“曲线抽屉示例”),
),
);
}
AppBar buildCustomAppBar(){
返回AppBar(
背景颜色:Colors.black,
领先:IconButton(
图标:图标(
_isDrawerOpened?图标。清除:图标。菜单,