web-dev-qa-db-fra.com

Passage de type générique par fonction (t) dans le flutter

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(){

  }
}
8
quantum apps

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,
      ),
    );
  }
}
1
Rene