user2382627
user2382627

Reputation:

Multiple ScopedModels in flutter

I followed a tutorial from a flutter app with login system using a scope_model. Then, I added a new scope_model called Group to use in a new "route" called opportunities.

But in my new route I can't call the scope_model Group and I allways see the same error:

Error: Could not find the correct ScopedModel.

I think that my mistake is in main.dart. I don't know how to "invoque" my new scope_model.

Here is my code.

file opportuinity.dart

import 'package:scoped_model/scoped_model.dart';
import 'package:business_maker/data/models/group_api.dart';

(...)

  @override
  Widget build(BuildContext context) {
    final _group = ScopedModel.of<GroupModel>(context, rebuildOnChange: true);

file main.dart

 @override
  Widget build(BuildContext context) {
    return ScopedModel<ThemeModel>(
        model: _model,
        child: new ScopedModelDescendant<ThemeModel>(
          builder: (context, child, theme) => ScopedModel<AuthModel>(
            model: _auth,
            child: MaterialApp(
              theme: theme.theme,
              home: new ScopedModelDescendant<AuthModel>(
                  builder: (context, child, model) {
                    if (model?.user != null) return Home();
                    return LoginPage();
                  }),
              routes: <String, WidgetBuilder>{
                "/login": (BuildContext context) => LoginPage(),
                "/menu": (BuildContext context) => Home(),
                "/home": (BuildContext context) => Home(),
                "/settings": (BuildContext context) => SettingsPage(),
                "/opportunities": (BuildContext context) => OpportunityPage()
              },
            ),
          ),
        ));
  }

thank you

Upvotes: 0

Views: 162

Answers (1)

Adrian Murray
Adrian Murray

Reputation: 2304

If you want to use models in different routes then you need to place the model above the Navigator which is usually created in a WidgetsApp/MaterialApp/CupertinoApp

In your code I do not see a ScopedModel<Group> that's placed above the navigator. Or anywhere, actually. You need to add the group model above the navigator (something the materialapp creates for you).

  Widget build(BuildContext context) {
return ScopedModel<ThemeModel>(
    model: _model,
    child: ScopedModel<Group>(
        model: _yourGroupModel,
        child: new ScopedModelDescendant<ThemeModel>(
          builder: (context, child, theme) => ScopedModel<AuthModel>(
            model: _auth,
            child: MaterialApp(
              theme: theme.theme,
              home: new ScopedModelDescendant<AuthModel>(
                  builder: (context, child, model) {
                    if (model?.user != null) return Home();
                    return LoginPage();
                  }),
              routes: <String, WidgetBuilder>{
                "/login": (BuildContext context) => LoginPage(),
                "/menu": (BuildContext context) => Home(),
                "/home": (BuildContext context) => Home(),
                "/settings": (BuildContext context) => SettingsPage(),
                "/opportunities": (BuildContext context) => OpportunityPage()
              },
            ),
          ),
        )
    )
);

}

Upvotes: 0

Related Questions