如何将通用提供程序传递给 child?

How to pass generic provider to child?

我想创建一个我将在我的应用程序中多次使用的通用警报。

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

  @override
  Widget build(BuildContext context) {
    final model = Provider.of<IncomeViewModel>(context, listen: true).state;

    return AlertDialog(
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(40),
      ),

问题是我不知道如何传递 parent ChangeNotifier

的类型
                  showDialog<String>(
                    context: context,
                    builder: (_) =>
                        ChangeNotifierProvider<IncomeViewModel>.value(
                      value: view,
                      child: const SelectIconAlertDialogWidget(),
                    ),
                  );

我有很多将使用此警报的 ViewModel,因此不想重复此代码并编写我可以与任何 ViewModel 一起使用的通用警报。我怎样才能做到这一点?

创建一些抽象class,其中包含您希望用于该对话框的所有视图模型的方法或字段

abstract class AbstractViewModel{
  void doStuff();
}

为您的视图模型实施此class

class MyViewModel1 implements AbstractViewModel{
   @override
   void doStuff (){ print("from MyViewModel1");}
}

为您的对话框添加类型参数class

 class SelectIconAlertDialogWidget<T extends AbstractViewModel> extends StatelessWidget {
  const SelectIconAlertDialogWidget({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // and you can use generic type T like this:
    final model = Provider.of<T>(context, listen: true);
    model.doStuff();

    return AlertDialog(
      shape: RoundedRectangleBorder(
        borderRadius: BorderRadius.circular(40),
      ),

并调用它传递类型参数SelectIconAlertDialogWidget<MyViewModel1>()

showDialog<String>(
                    context: context,
                    builder: (_) =>
                        ChangeNotifierProvider<MyViewModel1>.value(
                      value: view,
                      child: const SelectIconAlertDialogWidget<MyViewModel1>(),
                    ),
                  );

在对话框小部件的构建方法中,它将打印“来自 MyViewModel1”。希望你有抽象的概念。