Flutter:取消用户帐户删除时如何处理空上下文错误?

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

我在尝试删除 Flutter 应用中的用户帐户时遇到问题。我有一个确认对话框,询问用户是否确实要删除其帐户。但是,当用户通过单击对话框上的“取消”按钮取消删除过程时,我收到错误

Null check operator used on a null value
。我认为这里的上下文可能为空。

我知道以前曾有人问过此类问题,但从昨天开始我一直在努力解决这个错误。有人可以提供有关如何处理此问题的指导吗?任何帮助将不胜感激。

这是我的代码

    Future<void> deleteUserAccount(BuildContext context) async {
    final confirmed = await showDialog(
        context: context,
        builder: (_) {
          return CupertinoAlertDialog(
            title: Text('Confirm Account Deletion'),
            content: Text('Are you sure you want to delete your account? This action cannot be undone.'),
            actions: [
              TextButton(
                onPressed: () => Navigator.pop(context, false),
                child: const Text('Cancel'),
              ),
              TextButton(
                onPressed: () => Navigator.pop(context, true),
                child: const Text('Delete'),
              ),
            ],
          );
        });
    if (confirmed != null && confirmed) {
      final provider = Provider.of<DeleteAccountProvider>(context, listen: false);
      SharedPreferences prefs = await SharedPreferences.getInstance();
      String? userToken = prefs.getString('user_login_token');
      final userProvider = Provider.of<UserProvider>(context, listen: false);
      final email = userProvider.user?.email;
      final success = await provider.deleteAccount(context, userToken ?? '', email ?? '');
      if (success) {
        logout();
      }
    }
  }

  Future<void> logout() async {
    final prefs = await SharedPreferences.getInstance();
    if (kDebugMode) {
      print('Language Code After Logout: ${prefs.getString('languageCode')}');
    }
    if (mounted) {
      context.read<UserProvider>().clearUserData();
    }
    await prefs.remove("user_login_token");
    if (mounted) {
      Navigator.pushAndRemoveUntil(
          context,
          MaterialPageRoute(
            builder: (context) => const OnBoardingScreen(),
          ),
          (route) => false);
    }
  }

这是错误

    ======== Exception caught by gesture ===============================================================
The following _TypeError was thrown while handling a gesture:
Null check operator used on a null value

When the exception was thrown, this was the stack: 
#0      StatefulElement.state (package:flutter/src/widgets/framework.dart:5599:44)
#1      Navigator.of (package:flutter/src/widgets/navigator.dart:2683:47)
#2      Navigator.pop (package:flutter/src/widgets/navigator.dart:2573:15)
#3      _NavigationDrawerWidgetState.deleteUserAccount.<anonymous closure>.<anonymous closure> (package:the_link/widget/navigation_drawer_widget.dart:79:44)
#4      _InkResponseState.handleTap (package:flutter/src/material/ink_well.dart:1183:21)
#5      GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:315:24)
#6      TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:652:11)
#7      BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:309:5)
#8      BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:279:7)
#9      GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:167:27)
#10     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:499:20)
#11     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:475:22)
#12     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:430:11)
#13     GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:420:7)
#14     GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:383:5)
#15     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:330:7)
#16     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:299:9)
#17     _invoke1 (dart:ui/hooks.dart:328:13)
#18     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:429:7)
#19     _dispatchPointerDataPacket (dart:ui/hooks.dart:262:31)
Handler: "onTap"
Recognizer: TapGestureRecognizer#8ddf2
  debugOwner: GestureDetector
  state: ready
  won arena
  finalPosition: Offset(121.3, 501.3)
  finalLocalPosition: Offset(59.8, 23.7)
  button: 1
  sent tap down
====================================================================================================
flutter
1个回答
0
投票

怀疑问题是你忽略了变量绑定。你有:

await showDialog(
    context: context,
    builder: (_) { .... 

我认为你应该:

await showDialog(
    context: context,
    builder: (context) { .... 

现在,当您执行

context
时,您正在使用第一个
Navigator.pop(context, false)
,我怀疑您不应该 - 您应该在构建器函数中使用
context

© www.soinside.com 2019 - 2024. All rights reserved.