Flutter Pageview 在方向变化时丢失索引

标签 flutter flutter-layout device-orientation flutter-pageview

最近也出现过类似的问题,不过已经在 GitHub 上解决并关闭了。 由于我是新手,我可能会在这里遗漏一些东西。 方向更改后,页面索引恢复为零,但选定的 BottomNavigationBarItem 保持原样。 这里正在显示页面“ONE”,但在旋转设备之前选择了选项卡“FOUR” Screenshot


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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Pageview Orientation Bug',
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int _page = 0;
  PageController _controller = PageController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: OrientationBuilder(
        builder: (context,orientation) {
          return orientation == Orientation.portrait
           ? Column(
            children: [
              Expanded(child: Container(color: Colors.grey)),
              Expanded(
                child: PageView(
                  controller: _controller,
                  children: [Text("ONE"),  Text("TWO"),Text("THREE"), Text("FOUR"),],
                ),
              ),
            ],
          )
          
         :  Row(
            children: [
              Expanded(child: Container(color: Colors.grey)),
              Expanded(
                child: PageView(
                  controller: _controller,
                  children: [Text("ONE"),  Text("TWO"),Text("THREE"), Text("FOUR"),],
                ),
              ),
            ],
          );
        }
      ),
      bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.fixed,
        currentIndex: _page,
        onTap: (page) {
          setState(() {
            _page = page;
          });
          _controller.jumpToPage(page);
        },
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.directions_bike),
            label: "ONE",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.directions_boat_outlined),
            label: "TWO",
           ),
          BottomNavigationBarItem(
            icon: Icon(Icons.directions_car),
            label: "THREE",
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.directions_run),
            label: "FOUR",
          ),
        ],
      ),
    );
  }
}

最佳答案

final Key _key = GlobalKey(); 添加到 HomeState 并将 key 传递给两个 PageView 构造函数。这将告诉 Flutter 它是相同的 PageView 并且在方向改变时需要移动,而不是替换。

编写代码时,每次都会创建一个新的 PageView 元素,而不维护状态,因此在以下情况下使用 PageControllerinitialValue已建成。

不相关的建议

PageView 是可滚动的,并且在编写代码时,如果用户滚动,它不会更新 BottomNavigationBar。以下是几种方法,具体取决于您所追求的用户体验。

PageView(
  // use never scrollable physics if you only want the user to change pages via the nav bar
  physics: NeverScrollableScrollPhysics(),
  // use onPageChanged to sync scroll and nav bar
  onPageChanged: (page) {
    // remove this line from nav bar onTap
    setState(() => _page = page);
  },
  key: _key,
  controller: _controller,
  children: [
    Text("ONE"),
    Text("TWO"),
    Text("THREE"),
    Text("FOUR"),
  ],
),

关于Flutter Pageview 在方向变化时丢失索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64993475/

相关文章:

flutter - 如何在屏幕加载时只调用一次 bloc 事件

flutter - 如何在 Flutter 中设计这种类型的仪表板?

javascript - 在页面加载时使用设备方向

css - 媒体查询和设备方向改变

objective-c - ios强制设备旋转

调用 pushReplacement 后 Flutter StreamProvider 未更新

charts - 如何在 flutter 中制作动态图表?

list - 在具有动态高度的同一页面上 flutter 两个 listview.builder

Flutter Listview 可滚动行

dart - 在这种情况下,中心和扩展之间的区别?