- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在 PageController
上使用带有监听器的 PageView
小部件,因此当我滚动 PageView
时,页面将转换为滚动值。我已经实现了这个,但问题是当使用 1.0 的 viewportFraction
时,旧页面会消失。如果我将 viewportFraction
降低到 1.0 以下(例如 0.95),这个问题就不会持续存在,如下所示:
viewportFraction = 1.0
,旧页面将消失。
viewportFraction = 0.95
,没问题。
我需要使用全宽,但我还需要保持非事件页面可见。请帮忙。
下面是我的完整代码:
import 'package:flutter/material.dart';
void main() => runApp(TestApp());
class TestApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primaryColor: Colors.lightBlue,
scaffoldBackgroundColor: Colors.white,
),
home: MainScreen(),
);
}
}
class MainScreen extends StatefulWidget {
final int initialPage;
MainScreen({Key key, this.initialPage = 1}) : super(key: key);
@override
MainScreenState createState() => MainScreenState();
static MainScreenState of(BuildContext context) {
return context.ancestorStateOfType(TypeMatcher<MainScreenState>());
}
}
class MainScreenState extends State<MainScreen> {
final List<GlobalKey<MainPageStateMixin>> _pageKeys = [
GlobalKey(),
GlobalKey(),
GlobalKey(),
];
PageController _pageController;
int _page;
double _pageValue;
@override
void initState() {
super.initState();
_page = widget.initialPage ?? 1;
_pageController = PageController(viewportFraction: 1.0, initialPage: _page);
_pageController.addListener(() {
setState(() => _pageValue = _pageController.page);
});
_pageValue = widget.initialPage.toDouble();
WidgetsBinding.instance.addPostFrameCallback((_) {
_pageKeys[widget.initialPage].currentState.onPageVisible();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
title: Text("Custom PageView"),
),
body: Container(
child: PageView(
//physics: NeverScrollableScrollPhysics(),
controller: _pageController,
onPageChanged: _onPageChanged,
children: <Widget>[
PeoplePage(key: _pageKeys[0], val: _pageValue, bgColor: Colors.purple,),
TimelinePage(key: _pageKeys[1], val: _pageValue - 1.0, bgColor: Colors.green,),
StatsPage(key: _pageKeys[2], val: _pageValue - 2.0, bgColor: Colors.amber,),
],
),
),
bottomNavigationBar: BottomNavigationBar(
currentIndex: _page,
onTap: _onBottomNavItemPressed,
items: <BottomNavigationBarItem>[
BottomNavigationBarItem(
title: Text('people'),
icon: Icon(Icons.people),
),
BottomNavigationBarItem(
title: Text('timeline'),
icon: Icon(Icons.history),
),
BottomNavigationBarItem(
title: Text('stats'),
icon: Icon(Icons.pie_chart),
),
],
),
);
}
@override
void reassemble() {
super.reassemble();
_onPageChanged(_page);
}
void _onPageChanged(int page) {
setState(() => _page = page);
_pageKeys[_page].currentState.onPageVisible();
}
void _onBottomNavItemPressed(int index) {
setState(() => _page = index);
_pageController.animateToPage(
index,
duration: Duration(milliseconds: 400),
curve: Curves.fastOutSlowIn,
);
}
}
abstract class MainPageStateMixin<T extends StatefulWidget> extends State<T> {
void onPageVisible();
}
class PeoplePage extends StatefulWidget {
PeoplePage({Key key, this.val, this.bgColor}) : super(key: key);
final double val;
final Color bgColor;
@override
PeoplePageState createState() => PeoplePageState();
}
class PeoplePageState extends State<PeoplePage> with MainPageStateMixin {
@override
void onPageVisible() {
}
@override
Widget build(BuildContext context) {
return Transform.rotate(
angle: 0.0, //widget.val,
child: Container(
color: widget.bgColor?.withOpacity(0.2),
child: Center(
child: Text('Halaman People ${widget.val}'),
),
),
);
}
}
class TimelinePage extends StatefulWidget {
TimelinePage({Key key, this.val, this.bgColor}) : super(key: key);
final double val;
final Color bgColor;
@override
TimelinePageState createState() => TimelinePageState();
}
class TimelinePageState extends State<TimelinePage> with MainPageStateMixin {
@override
void onPageVisible() {
}
@override
Widget build(BuildContext context) {
Matrix4 _pmat(num pv) {
return Matrix4(
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, pv * 0.001,
0.0, 0.0, 0.0, 1.0,
);
}
Matrix4 perspective = _pmat(1.0);
double scl = widget.val < 0 ? 1.0 + widget.val / 3.0 : 1.0;
return Transform(
transform: Matrix4.translationValues(widget.val * 200, 0, 0),
child: Transform(
alignment: FractionalOffset.center,
transform: perspective.scaled(scl, scl, scl)
..rotateX(0.0)
..rotateY(widget.val < 0 ? widget.val * -1.0 : 0.0)
..rotateZ(0.0),
child: Container(
color: widget.bgColor?.withOpacity(0.2),
child: Center(
child: Text('Halaman Timeline ${widget.val}'),
),
),
),
);
}
}
class StatsPage extends StatefulWidget {
StatsPage({Key key, this.val, this.bgColor}) : super(key: key);
final double val;
final Color bgColor;
@override
StatsPageState createState() => StatsPageState();
}
class StatsPageState extends State<StatsPage> with MainPageStateMixin {
@override
void onPageVisible() {
}
@override
Widget build(BuildContext context) {
return Transform.translate(
offset: Offset((widget.val + 1.0) * 100.0, 0.0),
child: Container(
color: widget.bgColor?.withOpacity(0.2),
child: Center(
child: Text('Halaman Stats ${widget.val}'),
),
),
);
}
}
最佳答案
关于Flutter 在转换后的 PageView 中保持旧页面可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57448696/
考虑 PageView我们有一个的用法 PageView在另一个里面: PageView( children: [ Container(color: Colors.red), Co
如何包装 PageView 的内容,以便 Indicators 出现在 PageView 结束位置的正下方?。现在 PageView 填满了整个屏幕,而 Indicators 位于屏幕底部。下面是 P
跟踪页面浏览量的最佳方法是什么?例如:SO 有一个问题有多少次观看,但点击刷新并没有增加观看次数。 我读过使用 cookie 是一种很好的方法,但我不知道这不会失控。 我已经到处搜索,找不到一个好的答
我对 Flutter 和构建我的第一个真正的应用程序还很陌生。我实现了一个路由器类并从用于导航的图标按钮生成命名路由。下一步,我还想通过滑动在 3 个屏幕之间切换。 我的结构是: main.dart
我有带有 PageView 小部件的简单页面,里面有 ListView。滚动 PageView 将不起作用。原因很简单。因为指针事件被嵌套的 child 消耗了。 @override Widg
我有一个简单的页面 View : PageView( controller: _pageController, physics: PlatformScrollPhysics.getPlatfo
最近也出现过类似的问题,不过已经在 GitHub 上解决并关闭了。由于我是新手,我可能会在这里遗漏一些东西。方向更改后,页面索引恢复为零,但选定的 BottomNavigationBarItem 保持
我正在尝试更改滚动速度并使其在此PageView项目上变得流畅: PageView.builder( // store this controller in a Sta
我想使用带有垂直轴的 PageView 并使用鼠标滚动在页面之间移动,但是当我使用鼠标滚动时页面不滚动...仅页面单击并向上/向下滑动时滚动。 有什么办法吗? 我想保留属性 pageSnapping:
当滑动页面 View 上的页面时,它有一种默认动画,可以将页面带到屏幕中央。我想让这个滑动的动画曲线和持续时间冷却下来,按下按钮上的 animateTo() 是相同的。 我已经尝试了所有不同的曲线和持
我想使用带有垂直轴的 PageView 并使用鼠标滚动在页面之间移动,但是当我使用鼠标滚动时页面不滚动...仅页面单击并向上/向下滑动时滚动。 有什么办法吗? 我想保留属性 pageSnapping:
当滑动页面 View 上的页面时,它有一种默认动画,可以将页面带到屏幕中央。我想让这个滑动的动画曲线和持续时间冷却下来,按下按钮上的 animateTo() 是相同的。 我已经尝试了所有不同的曲线和持
我的图像没有完全适应屏幕。顶部和底部有白色边框我的图像有 700x1002。 有人可以帮助我获得这些边缘并使图像/容器完全适合屏幕吗? 布局.xml:
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
您好,如果我按下第一个页面选项卡上的按钮,我试图跳转到第二个页面选项卡。目前我只知道我的第二页小部件的调用路由但 bottomnavbar 不存在......我不知道如何从我的第一页选项卡调用我的父小
我制作了一个用作图像轮播的 PageView。如何让它在 Flutter 延迟一段时间后自动在页面之间无限滚动? new PageView( children: List {
我希望用户在 PageView 中的页面之间滚动,但我不想在他们尝试在第一页之前和最后一页之后滚动时向他们显示动画。我可以在彩色动画、黑色动画和不滚动之间切换,但我找不到任何禁用动画的可能性。 如果没
我使用 Flutter 编程才一个半月,还很缺乏经验。但是我有一个问题,我在互联网上找不到答案。我需要一个主要由 PageView 组成的应用程序。不幸的是,对于 PageView,所有页面的大小始终
我在我的 flutter 应用程序中使用 PageView 构建器来显示可滚动的卡片。为此,我首先创建了一个小部件 _buildCarousel 和小部件 _buildCarouselItem 以使用
我有一个显示页面列表的 pageView。 应用程序提供了一个 + 按钮,用于在集合的末尾添加一个新页面。 一旦成功创建了这个新页面,我需要 pageView 自动跳转到最后一页。 如果我尝试重新显示
我是一名优秀的程序员,十分优秀!