Android 在flatter中如何使页面浏览速度更快?动画似乎很慢,内部ListView无法响应我的垂直手势

Android 在flatter中如何使页面浏览速度更快?动画似乎很慢,内部ListView无法响应我的垂直手势,android,flutter,Android,Flutter,您可以在中查看详细信息 我不知道怎么解决这个问题。与Android原生ViewPager相比,Flatter中的PageView的动画速度似乎较慢,用户只需等待这个缓慢的动画完全停止,就可以拖动内部的ListView。我觉得用户体验比Android原生ViewPager差。希望有一个完美的解决方案 import'包装:flift/cupertino.dart'; 进口“包装:颤振/材料.省道”; 导入“包:颤振应用程序/反应性页面视图/反应性页面视图.dart”; void main()=>ru

您可以在中查看详细信息

我不知道怎么解决这个问题。与Android原生ViewPager相比,Flatter中的PageView的动画速度似乎较慢,用户只需等待这个缓慢的动画完全停止,就可以拖动内部的ListView。我觉得用户体验比Android原生ViewPager差。希望有一个完美的解决方案

import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
导入“包:颤振应用程序/反应性页面视图/反应性页面视图.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:第页(),
);
}
}
类页面扩展StatefulWidget{
@凌驾
_PageState createState();
}
页面浏览视图;
类PageState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:cupertinanaviationbar(
中间:文本(“演示”),
),
正文:PageView.builder(
物理:弹跳CrollPhysics(),
物品计数:3,
itemBuilder:(上下文,索引){
返回ItemPage();
}),
);
}
}
类ItemPage扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回ListView.builder(
物理:弹跳CrollPhysics(),
物品计数:30,
itemBuilder:(上下文,索引){
返回填充(
填充:常数边集全部(8.0),
子:文本('这是第$索引',样式:TextStyle(fontSize:30)),
);
});
}
}

您可以定义自己的PageController实例,并使用其方法nextPage()和previousPage()。它们具有“duration”参数,用于控制页面视图的滚动速度

final PageController controller = PageController(
    viewportFraction: 0.9,
  );

  void nextPage() async {
    await controller.nextPage(
      duration: Duration(milliseconds: 200),
      curve: Curves.easeOut,
    );
  }

  void prevPage() async {
    await controller.previousPage(
      duration: Duration(milliseconds: 200),
      curve: Curves.easeOut,
    );
  }
然后将此控制器应用于页面视图:

return PageView.builder(
      physics: NeverScrollableScrollPhysics(),
      controller: controller,
      ...
    );
main.dart的完整代码:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyPageViewExample(),
    );
  }
}

class MyPageViewExample extends StatelessWidget {
  MyPageViewExample({Key key}) : super(key: key);

  final PageController controller = PageController(
    viewportFraction: 0.9,
  );

  void nextPage() async {
    await controller.nextPage(
      duration: Duration(milliseconds: 200),
      curve: Curves.easeOut,
    );
  }

  void prevPage() async {
    await controller.previousPage(
      duration: Duration(milliseconds: 200),
      curve: Curves.easeOut,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Stack(
        children: <Widget>[
          Container(
            color: Colors.grey[100],
          ),
          Padding(
            padding: EdgeInsets.only(top: 20.0 + MediaQuery.of(context).padding.top, bottom: 20.0),
            child: _buildCarousel(context),
          ),
        ],
      ),
    );
  }

  Widget _buildCarousel(BuildContext context) {
    return PageView.builder(
      physics: NeverScrollableScrollPhysics(),
      controller: controller,
      scrollDirection: Axis.horizontal,
      itemBuilder: (BuildContext context, int itemIndex) {
        return _buildItem(context, itemIndex);
      },
      itemCount: 5,
    );
  }

  Widget _buildItem(BuildContext context, int itemIndex) {
    return Padding(
      padding: EdgeInsets.only(left: 4.0, top: 10.0, right: 4.0, bottom: 10.0),
      child: GestureDetector(
        onPanUpdate: (details) {
          if (details.delta.dx < 0) {
            nextPage();
          }
          if (details.delta.dx > 0) {
            prevPage();
          }
        },
        child: Container(
          decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.all(Radius.circular(35.0)),
          ),
          child: Center(
            child: Text(
              'Item ' + (itemIndex + 1).toString(),
            ),
          ),
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
主页:MyPageViewExample(),
);
}
}
类MyPageViewExample扩展了无状态小部件{
MyPageViewExample({Key}):超级(Key:Key);
最终页面控制器=页面控制器(
视口分数:0.9,
);
void nextPage()异步{
等待控制器。下一页(
持续时间:持续时间(毫秒:200),
曲线:Curves.easeOut,
);
}
void prevPage()异步{
等待控制器。上一页(
持续时间:持续时间(毫秒:200),
曲线:Curves.easeOut,
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:堆栈(
儿童:[
容器(
颜色:颜色。灰色[100],
),
填充物(
padding:EdgeInsets.only(顶部:20.0+MediaQuery.of(context).padding.top,底部:20.0),
子项:_buildCarousel(上下文),
),
],
),
);
}
Widget_buildCarousel(BuildContext上下文){
返回PageView.builder(
物理学:NeverscrollableScroll物理学(),
控制器:控制器,
滚动方向:轴水平,
itemBuilder:(BuildContext上下文,int itemIndex){
返回_buildItem(上下文、itemIndex);
},
物品计数:5,
);
}
小部件_buildItem(BuildContext上下文,intItemIndex){
返回填充(
填充:仅限边设置(左:4.0,顶部:10.0,右:4.0,底部:10.0),
儿童:手势检测器(
onPanUpdate:(详细信息){
如果(details.delta.dx<0){
下一页();
}
如果(details.delta.dx>0){
prevPage();
}
},
子:容器(
装饰:盒子装饰(
颜色:颜色,白色,
borderRadius:borderRadius.all(半径.圆形(35.0)),
),
儿童:中心(
子:文本(
'Item'+(itemIndex+1).toString(),
),
),
),
),
);
}
}

请将您的代码添加到问题中好的,我已经这样做了您是否已经在发布模式下测试了您的代码?有些动画只会在发布模式下流畅,因为你的应用程序会更加优化。我已经测试过,就像调试模式一样,我只想垂直拖动更快,而不是等待动画停止。与本机应用程序相比,此动画速度较慢,这让我感到不舒服。我也有这个问题,在水平动画完成之前,用户无法在“我的页面视图”中的页面上开始垂直拖动,这需要很长时间才能完成。我想要一个方法,使动画结束更快。伟大的例子!您是否认为本地方法不能更具响应性?似乎在本机方法中,页面需要拖动超过视口0.5的距离才能继续。。。。