可重现的代码:
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)
我想更新count
from的值ButtonWidget
,我确信它在CounterInheritedWidget
课堂上得到更新,但它没有反映在屏幕上。我怎样才能打电话setState
或类似的事情InheritedWidget
?
任何帮助将不胜感激,我是 Flutter 和 Dart 的新手,所以在解决此类问题时遇到了困难。谢谢您,祝您有美好的一天。
注意: 我并不是在寻找诸如Provider
、ScopedModel
、 之类的插件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
存在的原因。
归档时间: |
|
查看次数: |
4422 次 |
最近记录: |