2

再会。我看过一个关于 Flutter 的 InheritedModel 的视频,并对它产生了兴趣。不幸的是,我似乎无法让它正常工作。


摘要:需要帮助如何正确实现 InheritedModel。

预期的代码输出:更新参数CountText时不应更新小部件。countCountModel

实际代码输出CountText仍在更新(我认为这是因为父小部件是 a StatefulWidget


细节

我正在尝试Counter使用InheritedModel. 下面的代码是我的代码

import 'package:flutter/material.dart';

class CountModel extends InheritedModel<String> {

  final int count;  

  CountModel({ this.count, child }) : super(child: child);

  @override
  bool updateShouldNotify(CountModel oldWidget) {
    if (oldWidget.count != count) {
      return true;
    }
    return false;
  }

  @override
  bool updateShouldNotifyDependent(InheritedModel<String> oldWidget, Set<String> dependencies) {
    if (dependencies.contains('counter')) {
      return true;
    }
    return false;
  }

  static CountModel of(BuildContext context, String aspect) {
    return InheritedModel.inheritFrom<CountModel>(context, aspect: aspect);
  }

}

class App extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Counter',
      theme: Theme.of(context),
      home: Counter(),
    );
  }
}

class Counter extends StatefulWidget {
  @override
  CounterState createState() => CounterState();
}

class CounterState extends State<Counter> {

  int count = 0;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        // title: Text("Counter"),
      ),
      body: CountModel(
        count: count,
        child: CounterText()
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() {
            ++count;          
          });
        },
        child: Icon(Icons.add),
      ),
    );
  }
}

class CounterText extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    CountModel model = CountModel.of(context, 'test');
    return Text('Count: ${model.count}');
  }  

}

我有一个 CountModel asInheritedModel和一个CountText小部件,它使用来自CountModel. 正如您在 的实现中所看到的CountText,它test在获取CountModel. count据我了解,在 CountModel 中更新值时不应更新它。不幸的是,这不会发生。

4

1 回答 1

3

简而言之,您应该使用const

将 const 添加到CounterText构造函数

class CounterText extends StatelessWidget {
  const CounterText();
  ...
}

并在创建CounterText()实例时使用const ( const CounterText() )

class CounterState extends State<Counter> {
  ...

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      ...
      body: CountModel(..., child: const CounterText()),
      ...
    );
  }
}

我已经详细描述为什么会发生这种情况

于 2019-01-03T00:28:59.733 回答