我从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。但是在我的情况下没有可以替代的参考。
我真的希望得到社区的支持。
您可以尝试以下步骤,希望对您有帮助!
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(),
),
),
);
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'),
),
),
);
}
}