Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

provider to riverpod with param #72

Closed
bcihanc opened this issue Aug 5, 2020 · 9 comments
Closed

provider to riverpod with param #72

bcihanc opened this issue Aug 5, 2020 · 9 comments
Labels
documentation Improvements or additions to documentation

Comments

@bcihanc
Copy link

bcihanc commented Aug 5, 2020

Firstly, thanks a thousand times fot these great packages.

I wanted to move my entire project from provider to riverpod. But i’m stuck at this point.

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());
  }
}

This is my provider widget for subwidgets. Its initialize only once. How can I move this class to Hook Widget with riverpod?

@bcihanc bcihanc added the documentation Improvements or additions to documentation label Aug 5, 2020
@rrousselGit
Copy link
Owner

Local state is not supported by providers.

What is your use-case in creating the ChangeNotifier locally like that?

@bcihanc
Copy link
Author

bcihanc commented Aug 5, 2020

EditQuestionScreen build before firebase fetch and deserialize. Actually I just need to know, can I create global provider with widget params in riverpod?

Like this

class AHookWidget extends HookWidget {
  AHookWidget({this.question, this.answers});

  final QuestionModel question;
  final List<AnswerModel> answers;

  // i dont want local variable like this, i want global
  final aProvider = ChangeNotifierProvider(
      (ref) => QuestionProvider(question: this.question, answers: this.answers));

  @override
  Widget build(BuildContext context) {
    final provider = useProvider(aProvider);
    return Container();
  }
}

class ASubHookWidget extends HookWidget {

  @override
  Widget build(BuildContext context) {
    final provider = useProvider(aProvider);
    return Container();
  }
}

@rrousselGit
Copy link
Owner

No you can't

@bcihanc
Copy link
Author

bcihanc commented Aug 5, 2020

I'm sorry to hear that, thank you for your help anyway 😊

@bcihanc bcihanc closed this as completed Aug 5, 2020
@rrousselGit
Copy link
Owner

I mean, there's likely a different way to do what you want.
But I don't know your architecture.

@bcihanc
Copy link
Author

bcihanc commented Aug 5, 2020

may be stupid but like this

onPressed: () async {
  QuestionModel question = await api.getQuestion();
  List<AnswerModel> answers = await api.getAnswers();

  MaterialPageRoute(builder: (context) => 
    EditQuestionScreen(question: question, answers: answers));
}
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());
  }
}

@rrousselGit
Copy link
Owner

Put the questions and answers inside a provider
Then you will be able to put your ChangeNotifier in a provider too

@bcihanc
Copy link
Author

bcihanc commented Aug 5, 2020

Ok, i will do that, the problem will be solved that case. Thanks again, you saved me.

@bcihanc
Copy link
Author

bcihanc commented Sep 5, 2020

I think ScopedProvider is the solution.

final scopedProvider = ScopedProvider<String>((_) => throw UnimplementedError());

class AWidget extends HookWidget {
  AWidget({@required this.value});
  final String value;

  @override
  Widget build(BuildContext context) {
    return ProviderScope(
      overrides: [scopedProvider.overrideWithValue(this.value)],
      child: BWidget()
     );
  }
}
class BWidget extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final providerValue = useProvider(scopedProvider);
    return Text(providerValue);
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

2 participants