dart - <MyModel> 的错误 : Could not find the correct ScopedModel when using ScopedModel.(上下文)

标签 dart flutter scoped-model

作为研究 Flutter 状态管理的局外人,我喜欢使用 scoped_model 的想法。用于 flutter.dev 中推荐的状态管理.我重写了正在运行的计数器应用程序。我可以使用 ScopedModelDescendant<CounterModel> 访问模型属性,但我无法使用 ScopedModel.of<CounterModel>(context) 访问模型属性.有人可以建议我可能做错了什么吗?我有一种预感,它可能在 ScopedModel 的位置。在我的小部件树中。我的代码和错误消息如下。

ma​​in.dart

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

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() , 我收到以下错误


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:

我查看了一些 SO 问题,但没有任何帮助。

最佳答案

是的,那是因为 context你通过不会有 ScopedModelCounterModel .

你可以做的是包装你的 buildFab2Builder 里面将为您提供 context 的小部件有ScopedModelCounterModel作为家长。

喜欢:

Builder(
    builder: (context){
      return buildFab2(context);
    },
  )

您的应用将如下所示:

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

希望对您有所帮助!

关于dart - <MyModel> 的错误 : Could not find the correct ScopedModel when using ScopedModel.(上下文),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55862549/

相关文章:

dart - AngularDart 动态改变页面标题

flutter - 使用 flutter 动画将图标旋转 180 度

flutter - 使用 Scoped 模型显示对话框

dart - 如何获得访问作用域模型模型

firebase - 如何从Firestore检索List <Map <String,dynamic >>?

dart - 下面的Flutter读写文件文档有没有浪费实现?

android - 如何使Firebase用户在Google登录功能之外 flutter 朔迷离?

Flutter Scoped 模型 - 传递多个模型

flutter - 在 flutter 构建之前运行自定义命令?

testing - 在小部件测试期间,如何 stub 不属于类的函数?