首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >错误:在使用ScopedModel (上下文)时找不到正确的ScopedModel.of<MyModel>

错误:在使用ScopedModel (上下文)时找不到正确的ScopedModel.of<MyModel>
EN

Stack Overflow用户
提问于 2019-04-26 07:13:45
回答 2查看 1.6K关注 0票数 0

作为一个研究颤振状态管理的局外人,我喜欢使用scoped_model进行状态管理的想法,就像flutter.dev中推荐的那样。我正在重新编写计数器应用程序。我能够使用ScopedModelDescendant<CounterModel>访问模型属性,但是我在使用ScopedModel.of<CounterModel>(context)访问模型属性时遇到了困难。有人能告诉我我可能做错了什么吗?我有一种预感,它可能是ScopedModel在我的小部件树中的位置。下面是我的代码和错误信息。

main.dart

代码语言:javascript
运行
复制
import 'package:flutter/material.dart';
import 'package:scoped_model/scoped_model.dart';
import 'package:second/model/counter_model.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Widget build(context) {
    return ScopedModel(
      model: new CounterModel(),
      child: Scaffold(
          appBar: AppBar(
            title: Text('ScopedModel'),
          ),
          body: ScopedModelDescendant<CounterModel>(
            builder: (context, child, value) {
              return Text("Pressed ${value.counter} times");
            },
          ),
          floatingActionButton: buildFab1()),
    );
  }

  Widget buildFab1() {
    return ScopedModelDescendant<CounterModel>(
      builder: (context, child, model) => FloatingActionButton(
            child: Icon(Icons.add),
            onPressed: model.incrementCounter,
          ),
    );
  }

  Widget buildFab2(BuildContext context) {
    return FloatingActionButton(
      child: Icon(Icons.add),
      onPressed: ScopedModel.of<CounterModel>(context).incrementCounter,
    );
  }
}

model/counter_model.dart

代码语言:javascript
运行
复制
import 'package:scoped_model/scoped_model.dart';

class CounterModel extends Model {
  int _counter = 0;

  int get counter => _counter;

  void incrementCounter() {
    _counter++;
    notifyListeners();
  }
}

main.dart中,如果使用buildFab2(context)而不是buildFab1(),则会出现以下错误

代码语言:javascript
运行
复制
flutter: The following ScopedModelError was thrown building ScopedModelDescendant<Model>(dirty):
flutter: Error: Could not find the correct ScopedModel.
flutter:
flutter: To fix, please:
flutter:
flutter:   * Provide types to ScopedModel<MyModel>
flutter:   * Provide types to ScopedModelDescendant<MyModel>
flutter:   * Provide types to ScopedModel.of<MyModel>()
flutter:   * Always use package imports. Ex: `import 'package:my_app/my_model.dart';
flutter:

我看了几个这样的问题,但都没有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-26 09:37:08

是的,因为您传递的context不会有ScopedModel of CounterModel

您可以做的是将您的buildFab2封装在一个Builder小部件中,它将为您提供一个具有以CounterModel为父级的ScopedModelcontext

比如:

代码语言:javascript
运行
复制
Builder(
    builder: (context){
      return buildFab2(context);
    },
  )

你的应用程序看起来会是:

代码语言:javascript
运行
复制
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Widget build(context) {
    return ScopedModel(
      model: new CounterModel(),
      child: Scaffold(
        appBar: AppBar(
          title: Text('ScopedModel'),
        ),
        body: ScopedModelDescendant<CounterModel>(
          builder: (context, child, value) {
            return Text("Pressed ${value.counter} times");
          },
        ),
        floatingActionButton: Builder(
          builder: (context) {
            // return buildFab1() if fab one required
            return buildFab2(context);
          },
        ),
      ),
    );
  }

  Widget buildFab1() {
    return ScopedModelDescendant<CounterModel>(
      builder: (context, child, model) => FloatingActionButton(
            child: Icon(Icons.add),
            onPressed: model.incrementCounter,
          ),
    );
  }

  Widget buildFab2(BuildContext context) {
    return FloatingActionButton(
      child: Icon(Icons.add),
      onPressed: ScopedModel.of<CounterModel>(context).incrementCounter,
    );
  }
}

希望这能帮上忙!

票数 5
EN

Stack Overflow用户

发布于 2021-01-04 17:53:56

您需要像这样在main.dart中添加作用域模型:

代码语言:javascript
运行
复制
@override
  Widget build(BuildContext context){
    return ScopedModel<UserModel>(
        model: UserModel(),
        child: MaterialApp(
            title: "Quiz Flamengo",
            debugShowCheckedModeBanner: false,
            home: Scaffold(
              body: HomeScreen(),
            )
        )
    );
  }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55862549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档