gpt4 book ai didi

flutter - 将 ChangeNotifier 从 provider 迁移到 hooks_riverpod

转载 作者:行者123 更新时间:2023-12-03 04:19:59 25 4
gpt4 key购买 nike

我想将我的整个项目从 provider 转移到 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());
}
}

这是我的子小部件的提供程序小部件。它只初始化一次。我如何使用 riverpod 将此类编写为 HookWidget?

最佳答案

快速说明 - 使用 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 时返回的内容。

关于flutter - 将 ChangeNotifier 从 provider 迁移到 hooks_riverpod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63260327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com