J'essaie de créer un widget de consommation générique qui facilite la viewmodel à son enfant. Par conséquent, j'ai deux fonctions. Celui qui a une fonction (T) après l'init de la vue de la vue et l'autre pour passer le modèle à son widget enfant.
dans la classe générique est un enfant de changenodificateur et qui fonctionne bien jusqu'à ce que je souhaite envoyer la valeur T dans les deux fonctions.
ensuite, je reçois les erreurs suivantes:
type '(OnboardingViewModel) => NULL' n'est pas un sous-type de type '(Changenotifier) => Void'
et
type '(BuildContext, OnboardingViewModel, widget) => Echafaud' n'est pas un sous-type de type '(BuildContext, Changenotifier, Widget) => widget'
Mais lorsque je change le type d'étend de Changenotifier à l'inverboardingviewModel, tout fonctionne bien.
quelqu'un peut-il m'aider et expliquer pourquoi cela ne fonctionne pas ??
import 'package:flutter/material.Dart';
import 'package:get_it/get_it.Dart';
import 'package:provider/provider.Dart';
class StateFullConsumerWidget<T extends ChangeNotifier> extends StatefulWidget{
StateFullConsumerWidget({@required this.builder,Key key,this.onPostViewModelInit,this.child}) : super(key : key);
final Widget Function(BuildContext context, ChangeNotifier value, Widget child) builder;
final Widget child;
final void Function(T) onPostViewModelInit;
@override
_StateFullConsumerWidgetState<T> createState() => _StateFullConsumerWidgetState<T>();
}
class _StateFullConsumerWidgetState<T extends ChangeNotifier> extends State<StateFullConsumerWidget>{
T _viewModel;
@override
void initState() {
// assign the model once when state is initialised
_viewModel = GetIt.instance.get<T>();
widget.onPostViewModelInit(_viewModel);
super.initState();
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<T>(
builder: (context) => _viewModel,
child: Consumer<T>(
builder: widget.builder,
child: widget.child,
),
);
}
}
mon widget
StateFullConsumerWidget<OnBoardingViewModel>(
onPostViewModelInit: (viewModel){
buildIntroList(viewModel);
viewModel.maxPages = _introWidgetsList.length;
},
builder: (context,viewModel,child) {
return Scaffold(
key: widget.scaffoldKey,
body: SafeArea(
child: Container(),
),
),
);
},
);
mon point de vue
import 'package:flutter/material.Dart';
class OnBoardingViewModel extends ChangeNotifier{
OnBoardingViewModel(){
}
}
Je ne sais pas exactement pourquoi c'est le cas, mais le compilateur DART ne reconnaît pas le type T de l'Étatfulconsumerwidget comme le même type T du _stateFullConsumerWidgetState. Si vous transmettez les fonctions à l'état, tout fonctionne comme prévu.
Code résultant:
class StateFullConsumerWidget<T extends ChangeNotifier> extends StatefulWidget{
StateFullConsumerWidget({@required this.builder,Key key,this.onPostViewModelInit,this.child}) : super(key : key);
final Widget Function(BuildContext context, T value, Widget child) builder;
final Widget child;
final Function(T viewModel) onPostViewModelInit;
@override
_StateFullConsumerWidgetState<T> createState() => _StateFullConsumerWidgetState<T>(onPostViewModelInit, builder);
}
class _StateFullConsumerWidgetState<T extends ChangeNotifier> extends State<StateFullConsumerWidget>{
final Function(T viewModel) _onPostViewModelInit;
final Widget Function(BuildContext context, T value, Widget child) _builder;
T _viewModel;
_StateFullConsumerWidgetState(this._onPostViewModelInit, this._builder);
@override
void initState() {
// assign the model once when state is initialised
_viewModel = GetIt.instance.get<T>();
_onPostViewModelInit(_viewModel);
super.initState();
}
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider<T>(
builder: (context) => _viewModel,
child: Consumer<T>(
builder: _builder,
child: widget.child,
),
);
}
}