如何在InheritedWidget中调用setState或更新值?

iDe*_*ode 8 dart flutter

可重现的代码:

void main() => runApp(MaterialApp(home: CountInheritedWidget(child: HomePage())));

class CountInheritedWidget extends InheritedWidget {
  CountInheritedWidget({Widget child}) : super(child: child);

  final Map<String, int> _map = {"count": 0};

  // getter
  int get value => _map["count"];

  // setter
  set value(int x) => _map["count"] = x; // is there anything like setState here?

  @override
  bool updateShouldNotify(CountInheritedWidget oldCounter) => true;

  static CountInheritedWidget of(BuildContext context) => context.dependOnInheritedWidgetOfExactType<CountInheritedWidget>();
}

class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextWidget(),
            ButtonWidget(),
          ],
        ),
      ),
    );
  }
}

class TextWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    int count = CountInheritedWidget.of(context)?.value ?? -1;
    return Text("Count = $count");
  }
}

class ButtonWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      child: Text("Increment"),
      onPressed: () {
        CountInheritedWidget counter = CountInheritedWidget.of(context);
        int count = counter?.value ?? -1;
        counter.value = ++count;
      },
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

我想更新countfrom的值ButtonWidget,我确信它在CounterInheritedWidget课堂上得到更新,但它没有反映在屏幕上。我怎样才能打电话setState或类似的事情InheritedWidget

任何帮助将不胜感激,我是 Flutter 和 Dart 的新手,所以在解决此类问题时遇到了困难。谢谢您,祝您有美好的一天。


注意: 我并不是在寻找诸如ProviderScopedModel、 之类的插件Redux来完成这种工作。

Rém*_*let 12

InheritedWidgets 无法做到这一点。它们是完全不可变的,没有触发更新的机制。

如果您想发出更新,则必须将 InheritedWidget 与 StatefulWidget 结合起来,通常以这种方式完成:

class MyWidget extends StatefulWidget {
  const MyWidget({Key key, this.child}) : super(key: key);
  final Widget child;

  @override
  MyState createState() => MyState();
}

class MyState extends State<MyWidget> {
  String name;
  int age;

  @override
  Widget build(BuildContext context) {
    return MyInherited(
      name: name,
      age: age,
      child: widget.child,
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

哪里MyInheritedWidget

class MyInherited extends InheritedWidget {
  MyInherited({
    Key key,
    this.name,
    this.age,
    Widget child,
  }) : super(key: key, child: child);

  final String name;
  final int age;

  @override
  bool updateShouldNotify(MyInherited oldWidget) {
    return name != oldWidget.name && age != oldWidget.age;
  }

  @override
  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
    super.debugFillProperties(properties);
    properties.add(IntProperty('age', age));
    properties.add(StringProperty('name', name));
  }
}
Run Code Online (Sandbox Code Playgroud)

是的。太啰嗦了。这就是provider存在的原因。

  • 该解释没有反映通过使用 InheritedWidget 更新值的问题。 (4认同)