поставщик для Riverpod с параметром - PullRequest
0 голосов
/ 05 августа 2020

Я хотел переместить весь свой проект от провайдера к Riverpod. Но на этом я застрял.

class EditQuestionScreen extends StatelessWidget {
  EditQuestionScreen({this.question, this.answers});

  final QuestionModel question;
  final List<AnswerModel> answers;

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
        create: (context) => QuestionProvider(
            question: this.question,
            answers: this.answers),
        child: Container());
  }
}

Это мой виджет провайдера для подвиджетов. Его инициализируют только один раз. Как я могу переместить этот класс в Hook Widget с помощью riverpod?

1 Ответ

1 голос
/ 05 августа 2020

Краткое примечание - с Provider или Riverpod вы действительно не хотите / не должны называть вещь, которую вы предоставляете, thingProvider. Вы не предоставляете поставщика, вы предоставляете что-то, если это имеет смысл. поможет:

class QuestionModel {
  QuestionModel(this.id);

  final int id;
}

class AnswerModel {
  AnswerModel(this.id);

  final int id;
}

class QuestionWithAnswers {
  QuestionWithAnswers(this.question, this.answers);

  final QuestionModel question;
  final List<AnswerModel> answers;
}

class QuestionAnswerNotifier extends ChangeNotifier {
  QuestionAnswerNotifier(this.qwa);

  final QuestionWithAnswers qwa;

  QuestionModel get question => qwa.question;
  List<AnswerModel> get answers => qwa.answers;

  addAnswer(AnswerModel answer) {
    qwa.answers.add(answer);
    notifyListeners();
  }
}

final questionProvider =
    ChangeNotifierProvider.family<QuestionAnswerNotifier, QuestionWithAnswers>(
        (ref, qwa) => QuestionAnswerNotifier(qwa));

class EditQuestionScreen extends HookWidget {
  EditQuestionScreen({
    @required QuestionModel question,
    @required List<AnswerModel> answers,
    Key key,
  })  : qwa = QuestionWithAnswers(question, answers),
        super(key: key);

  final QuestionWithAnswers qwa;

  @override
  Widget build(BuildContext context) {
    final provider = useProvider(questionProvider(qwa));

    // Use data from provider to render your UI, for example:
    return Container(
      child: Column(
        children: <Widget>[
          Text('${provider.question}\n${provider.answers}'),
          RaisedButton(
            onPressed: () => provider.addAnswer(AnswerModel(5)),
            child: Icon(Icons.add),
          )
        ],
      ),
    );
  }
}

Здесь следует отметить несколько моментов.

  1. В Riverpod family - это то, как мы передаем параметры поставщикам.
  2. Класс QuestionWithAnswers объединяет модели, которые вы хотите передать поставщику с помощью дополнительного параметра, предоставляемого family .
  3. Имя поставщика имеет суффикс Provider, а не то, что оно есть предоставляя имя как таковое.
  4. Мы предоставляем ChangeNotifier, так что это то, что возвращается при вызове useProvider.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...