ListWheelScrollView 方向更改后位置错误

问题描述 投票:0回答:1

在我的 Flutter 项目中,我使用

ListWheelScrollView
在页面之间滑动。 我从页面导航到横向屏幕。 但是当我弹出来时,页码有时是错误的。

void main(List<String> args) {
  runApp(_Test());
}

class _Test extends StatelessWidget {
  const _Test({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: LayoutBuilder(
          builder: (context, constraints) {
            return RotatedBox(
              quarterTurns: -1,
              child: ListWheelScrollView.useDelegate(
                itemExtent: constraints.maxWidth,
                physics: PageScrollPhysics(),
                perspective: 0.002,
                childDelegate: ListWheelChildLoopingListDelegate(
                  children: List.generate(8, (index) {
                    return RotatedBox(
                      quarterTurns: 1,
                      child: GestureDetector(
                        child: Container(
                          alignment: Alignment.center,
                          color: Colors.primaries[index].shade200,
                          child: Text('<- Push $index ->'),
                        ),
                        onTap: () async {
                          await SystemChrome.setPreferredOrientations([
                            DeviceOrientation.landscapeLeft,
                            DeviceOrientation.landscapeRight,
                          ]);
                          await Navigator.push(context, MaterialPageRoute(builder: (context) {
                            return Scaffold(
                              appBar: AppBar(),
                              body: Center(
                                child: FilledButton(
                                  child: Text('Pop $index'),
                                  onPressed: () => Navigator.pop(context),
                                ),
                              ),
                            );
                          }));
                          await SystemChrome.setPreferredOrientations([
                            DeviceOrientation.portraitUp,
                            DeviceOrientation.portraitDown,
                          ]);
                        },
                      ),
                    );
                  }),
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}
flutter dart orientation
1个回答
0
投票

当我看到你的代码时,我建议你在进入另一个屏幕之前保存当前索引,并在返回后恢复它。这是我的代码,它对我有用,如果您遇到任何错误,请告诉我。

    import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

void main(List<String> args) {
  runApp(const _Test());
}

class _Test extends StatefulWidget {
  const _Test({super.key});

  @override
  State<_Test> createState() => _TestState();
}

class _TestState extends State<_Test> {
  int currentIndex = 0;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(),
        body: LayoutBuilder(
          builder: (context, constraints) {
            return RotatedBox(
              quarterTurns: -1,
              child: ListWheelScrollView.useDelegate(
                itemExtent: constraints.maxWidth,
                physics: const PageScrollPhysics(),
                perspective: 0.002,
                childDelegate: ListWheelChildLoopingListDelegate(
                  children: List.generate(8, (index) {
                    return RotatedBox(
                      quarterTurns: 1,
                      child: GestureDetector(
                        child: Container(
                          alignment: Alignment.center,
                          color: Colors.primaries[index].shade200,
                          child: Text('<- Push $index ->'),
                        ),
                        onTap: () async {
                          setState(() {
                            currentIndex = index;
                          });

                          await SystemChrome.setPreferredOrientations([
                            DeviceOrientation.landscapeLeft,
                            DeviceOrientation.landscapeRight,
                          ]);

                          await Navigator.push(context, MaterialPageRoute(builder: (context) {
                            return Scaffold(
                              appBar: AppBar(),
                              body: Center(
                                child: FilledButton(
                                  child: Text('Pop $index'),
                                  onPressed: () => Navigator.pop(context),
                                ),
                              ),
                            );
                          }));

                          await SystemChrome.setPreferredOrientations([
                            DeviceOrientation.portraitUp,
                            DeviceOrientation.portraitDown,
                          ]);

                          // Restore the scroll position
                          (context.findAncestorStateOfType<_TestState>()?.context
                              .findRenderObject() as RenderObject)
                              .markNeedsLayout();
                        },
                      ),
                    );
                  })),
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.