如何将通用提供程序传递给 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”。希望你有抽象的概念。
我想创建一个我将在我的应用程序中多次使用的通用警报。
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”。希望你有抽象的概念。