请勿跨异步间隙使用BuildContexts- Flutter

k7fdbhmy  于 2023-02-05  发布在  Flutter
关注(0)|答案(1)|浏览(337)

我在await之后使用SnackBar
因此,它显示的错误如下:

Do not use BuildContexts across async gaps

我使用if (!mounted)此行删 debugging 误。它删除了问题但是,SnackBar未显示。完成任务时
我的代码:

Future removeMethod() async {
    String res = await DatabaseMethods().idReject(widget.uid);
    if (res == "success") {
      if (!mounted) return;
      showSnackBar(context, "Job done!");
    } else {
      if (!mounted) return;
      showSnackBar(context, "Error!!");
    }
  }

showSnackBar是自定义小部件。它代码:

void showSnackBar(BuildContext context, String title) {
  final snackBar = SnackBar(
    content: CustomText(
      text: title,
      size: 16,
    ),
    backgroundColor: darkblueColor,
  );
  ScaffoldMessenger.of(context).showSnackBar(snackBar);
}

我能做些什么呢?我想在等待之后展示小吃吧。

fae0ux8s

fae0ux8s1#

这个基本的例子是基于你的代码段的。这里一个snackbar在一个future的结果返回后被调用(例如一个数据库调用)。如果这有用的话?

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

class SnackBarAfterFutureResult extends StatelessWidget {
  const SnackBarAfterFutureResult({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: OutlinedButton(
            onPressed: () async {
              await removeMethod()
                  .then((value) => showSnackBar(context, value));
            },
            child: const Text('Database call')),
      ),
    );
  }
}

void showSnackBar(BuildContext context, bool result) {
  String text = "Job done!";
  if (!result) {
    text = "Error!!";
  }
  final snackBar = SnackBar(content: Text(text), backgroundColor: Colors.blue);
  ScaffoldMessenger.of(context).showSnackBar(snackBar);
}

Future<bool> removeMethod() async {
  //e.g. getting result from database call
  bool isSuccess = false;
  await Future.delayed(const Duration(seconds: 2), () {
    isSuccess = Random().nextBool();
  });
  return isSuccess;
}

相关问题