StatefulBuilder有类似initState的东西吗?

Kyl*_*nch 0 dart flutter flutter-layout

我正在尝试在处理信用卡时创建一个加载对话框。我遇到的问题是我希望能够在我的未来完成时更新对话框状态。

更新对话框状态的唯一方法似乎是使用 StatefulBuilder 小部件。我发现这一点是因为我尝试在 processPayment 方法中更改 cartLoading 但没有任何反应。

我希望它在创建对话框时自动调用 processPayment(),而不是我必须点击按钮。这可能吗?

class CartModel extends ChangeNotifier {
  bool _cartLoading = false;
  bool get cartLoading => _cartLoading;
  set setLoading(bool value) {
    _cartLoading = value;
    notifyListeners();
  }
Future<bool?> openLoadingDialog(BuildContext context) async {
    setLoading = true;
    return showDialog<bool?>(
      context: context,
      builder: (context) => StatefulBuilder(
        builder: (context, setState) {
          return Dialog(
            child: Container(
              child: Column(
                children: [
                  CustomButton(
                      name: "Process payment",
                      onPressed: () {
                        setState(() => setLoading = true);
                        processPayment()
                         .then((value) => setState(() => setLoading = false));
                      },
                      primaryColor: Colors.black,
                      onPrimaryColor: Colors.white),
                  Center(
                    child: SizedBox(
                      width: 150,
                      height: 150,
                      child: cartLoading
                          ? const CircularProgressIndicator()
                          : const Text("Thank you for your order"),
                    ),
                  )
                ],
              ),
            ),
          );
        },
      ),
      barrierDismissible: false,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Enz*_*nzo 5

更新对话框状态的唯一方法似乎是使用 StatefulBuilder 小部件。

不必要。您可以创建一个普通的小部件:

class MyDialog extends StatefulWidget { ... }

class _MyDialogState extends State<MyDialog> {
  @override
  void initState() {
    super.initState();
    // Put your initialization logic here
  }

  @override
  Widget build(BuildContext context) {
    // Put your setState logic here
    return Dialog(
      child: Container(...),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

现在将其传递给showDialog

showDialog<bool?>(
  context: context,
  builder: (context) => MyDialog(),
);
Run Code Online (Sandbox Code Playgroud)