flutter 持续偏移:处于意外状态

z3yyvxxp  于 2023-01-18  发布在  Flutter
关注(0)|答案(2)|浏览(189)

我试图从一个页面转移到另一个页面,为此,我使用arrow_back icons返回到上一页,我使用Navigator.pop(context),但给出错误PersistedOffset: is in an unexpected state. Flutter Channel:Dev和设备:Web Chrome.谢谢!

class IndividualDetails extends StatefulWidget {
  const IndividualDetails({super.key, required this.chatModel});
  final ChatModel chatModel;
  @override
  State<IndividualDetails> createState() => _IndividualDetailsState();
}
class _IndividualDetailsState extends State<IndividualDetails> {
  @override
Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leadingWidth: 70,
        leading: InkWell(
          onTap: () {
             Navigator.of(context).pop();
          },
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: const [
              Icon(
                Icons.arrow_back,
                size: 24,
              ),
              CircleAvatar(
                radius: 20,
                backgroundColor: Colors.blueGrey,
              child: SvgPicture.asset(
                widget.chatModel.isGroup ? 'assets/groups.svg' : 'assets/person.svg',
                color: Colors.white,
                height: 32,
                width: 32,
              ),
              ),
            ],
          ),
        ),
      ),
    );
  }
 }

这是卡,当我点击此卡,它会nevate到IndividualDetails()页。我想返回此卡,当我点击后退按钮。

class CustomCard extends StatelessWidget {
  const CustomCard({super.key, required this.chatModel});
  final ChatModel chatModel;

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () => Navigator.of(context).push(MaterialPageRoute(
          builder: (context) => IndividualDetails(
                chatModel: chatModel,
              ))),
      child: Column(
        children: [
          ListTile(
            leading: CircleAvatar(
              radius: 30,
              backgroundColor: Colors.blueGrey,
              child: SvgPicture.asset(
                chatModel.isGroup ? 'assets/groups.svg' : 'assets/person.svg',
                color: Colors.white,
                height: 32,
                width: 32,
              ),
            ),
            trailing: Text(chatModel.time),
            title: Text(
              chatModel.name,
              style: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold),
            ),
            subtitle: Row(
              children: [
                const Icon(
                  Icons.done_all,
                  color: Colors.blue,
                  size: 20,
                ),
                const SizedBox(
                  width: 2.0,
                ),
                Text(chatModel.currentMessage),
              ],
            ),
          ),
          const Padding(
            padding: EdgeInsets.only(left: 80.0, right: 20.0),
            child: Divider(
              thickness: 1.5,
            ),
          ),
        ],
      ),
    );
  }
}
ogsagwnx

ogsagwnx1#

我在使用Navigator.pop(context)时遇到了同样的问题。这只发生在设备上:网页浏览器。
Android或iPhone设备中不会发生此行为。
我对此的临时解决方案是:Navigator.pushNamed(context, parent.routeName)这将强制导航到指定的视图。或者Navigator.pushNamedAndRemoveUntil(context, parent.routeName, (r) => false)和以前一样,但将清理导航堆栈。根据情况选择一个或另一个。
祝你好运。
好了,现在有一个更好的解决方案:
我在Android、iPhone和Chrome Web中测试了这一点,每次都能正常工作。
1.-使用本机flutter List集合管理Stacks的自定义类:

class Stacks<T> {
  final _stacks = <T>[];

  void push(T value) =>  _stacks.add(value);

  T? pop() => (isEmpty) ? null : _stacks.removeLast();

  T? get last => (isEmpty) ? null : _stacks.last;

  void clear() => _stacks.clear();

  int get length => _stacks.length;

  bool get isEmpty => _stacks.isEmpty;

  bool get isNotEmpty => _stacks.isNotEmpty;

  @override
  String toString() => _stacks.toString();
}
  1. ViewManager类现在将以一种简单的方式处理导航器,并在每个平台中正确地处理:
class ViewManager {
  final Stacks<String> _viewStack = Stacks<String>();
  bool _isInitialized = false;

  ViewManager() {
    init();
  }

  void init() {
    if (!_isInitialized) {
      _viewStack.push("/"); **//Here your initialRoute from main.dart**
      _isInitialized = true;
    }
  }

  void push(BuildContext context, String value) {
    _viewStack.push(value);
    Navigator.pushNamedAndRemoveUntil(context, value, (r) => false);
  }

  void pop(BuildContext context) {
    _viewStack.pop();
    String? value = _viewStack.last;
    Navigator.pushNamedAndRemoveUntil(context, value as String, (r) => false);
  }

  void popAndStay(BuildContext context) {
    _viewStack.pop();
  }

  void clearAndPush(BuildContext context, String value) {
    _viewStack.clear();
    _viewStack.push(value);
    Navigator.pushNamedAndRemoveUntil(context, value, (r) => false);
  }
}

1.将此变量添加为静态变量或提供程序:

ViewManager viewManager = ViewManager();

1.现在,只需使用此命令在所有视图之间导航,没有任何问题:

**//Run this in main.dart**
viewManager.init();

**//Move to this View**
viewManager.push(context, View.routeName);

**//Clear Stack and Move to this View**
viewManager.clearAndPush(context, View.routeName);

**//Return to parent View**
viewManager.pop(context);

再次祝你好运。

j9per5c4

j9per5c42#

我在网上使用flutter_svg包时遇到了这个错误。具体来说,当我试图弹回我的导航器中的一条在AppBar中显示SVG的路线时,这个错误被抛出。相当模糊。
我的解决方案是只使用图像小部件,我在网上使用flutter_svg时遇到了一些问题,所以如果可以的话尽量避免使用。

相关问题