在后台屏幕抖动时处理参数

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

我从flutter版本3.7升级到版本3.24时遇到问题

情况:我有一个屏幕。我将Named 推到第二个屏幕。如果用户与数据交互并保存数据。当回到上一个屏幕时,我将重新加载数据:

为了解决这个问题:我使用了: 在第二个屏幕上:

 WillPopScope(
      onWillPop: (){
        context.pop(hasChanged);
        return Future.value(true);
      },
    )

在第一个屏幕:我使用过

var hasChanged = await context.pushNamed(ApplicationRouteName.secondScreen);
if(hasChanged is bool){
  _handleReload();
}

但是:在 3.24 版本中,WillPopScope 被删减了。相反,它使用 PopScope 和 onPopInvokedWithResult。

我写道:

 PopScope(
      onPopInvokedWithResult: (_,__){
        if(hasChanged){
          Navigator.pop(context, true);
        }else{
          Navigator.pop(context, false);
        }
      },

我遇到了以下问题:

ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: 'package:flutter/src/widgets/navigator.dart': Failed assertion: line 5350 pos 12: '!_debugLocked': is not true.
#0      _AssertionError._doThrowNew (dart:core-patch/errors_patch.dart:50:61)
#1      _AssertionError._throwNew (dart:core-patch/errors_patch.dart:40:5)
#2      NavigatorState.pop (package:flutter/src/widgets/navigator.dart:5350:12)
#3      Navigator.pop (package:flutter/src/widgets/navigator.dart:2665:27)
#4      _ChannelScreenState.build.<anonymous closure> (package:iptv/features/channel/presentations/screens/channel_screen.dart:59:21)
#5      PopScope._callPopInvoked (package:flutter/src/widgets/pop_scope.dart:137:30)
#6      _PopScopeState.onPopInvokedWithResult (package:flutter/src/widgets/pop_scope.dart:172:12)
#7      ModalRoute.onPopInvokedWithResult (package:flutter/src/widgets/routes.dart:1780:16)
#8      NavigatorState.pop (package:flutter/src/widgets/navigator.dart:5362:19)
#9      NavigatorState.maybePop (p<…>

我查看了很多文档,知道这会影响到 android 14。但是在我的情况下没有可以替代的参考。

我真的希望得到社区的支持。

flutter
1个回答
0
投票

您可以尝试以下步骤,希望对您有帮助!

  1. 用 PopScope 包裹推送的屏幕:
Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => PopScope(
      onPopInvoked: (value) {
        // Handle the result here
        if (value != null) {
          print('Result: $value');
        }
        return true; // Return true to allow the pop operation
      },
      child: SecondScreen(),
    ),
  ),
);
  1. 在第二个屏幕中提供结果:
class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(   
      appBar: AppBar(
        title: Text('Second Screen'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // Provide a result when the user taps the button
            Navigator.pop(context, 'Result from Second Screen');
          },
          child: Text('Provide Result'),
        ),
      ),
    );
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.