Jay*_*den 9 setstate dart flutter
我有一个根类RootPage,StatefulWidget它始终在视图中.我想改变body的RootPage是通过控制RootPage's currentPage Widget从不同的类,如我的FeedPage类和其他类,我做什么呢?
示例代码
import 'package:flutter/material.dart';
class RootPage extends StatefulWidget {
@override
_RootPageState createState() => new _RootPageState();
}
class _RootPageState extends State<RootPage> {
FeedPage feedPage;
Widget currentPage;
@override
void initState() {
super.initState();
feedPage = FeedPage();
currentPage = feedPage;
}
@override
Widget build(BuildContext context) {
return new Scaffold(
//Current page to be changed from other classes too?
body: currentPage
);
}
}
class FeedPage extends StatefulWidget {
@override
_feedPageState createState() => new _feedPageState();
}
class _feedPageState extends State<FeedPage> {
@override
Widget build(BuildContext context) {
return new FlatButton(
onPressed: () {
setState(() {
//change the currentPage in RootPage so it switches FeedPage away and gets a new class that I'll make
});
},
child: new Text('Go to a new page but keep root, just replace this feed part'),
);
}
}
Run Code Online (Sandbox Code Playgroud)
我确信有一个明显的答案,但我似乎无法弄清楚如何有效地做到这一点,因此很容易整合未来的类并始终保持我的Root.
Din*_*ian 33
您可以使用回调函数来实现此目的.请参考以下代码.
import 'package:flutter/material.dart';
class RootPage extends StatefulWidget {
@override
_RootPageState createState() => new _RootPageState();
}
class _RootPageState extends State<RootPage> {
FeedPage feedPage;
Widget currentPage;
@override
void initState() {
super.initState();
feedPage = FeedPage(this.callback);
currentPage = feedPage;
}
void callback(Widget nextPage) {
setState(() {
this.currentPage = nextPage;
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
//Current page to be changed from other classes too?
body: currentPage
);
}
}
class FeedPage extends StatefulWidget {
Function callback;
FeedPage(this.callback);
@override
_feedPageState createState() => new _feedPageState();
}
class _feedPageState extends State<FeedPage> {
@override
Widget build(BuildContext context) {
return new FlatButton(
onPressed: () {
this.widget.callback(new NextPage());
// setState(() {
// //change the currentPage in RootPage so it switches FeedPage away and gets a new class that I'll make
// });
},
child: new Text('Go to a new page but keep root, just replace this feed part'),
);
}
}
Run Code Online (Sandbox Code Playgroud)
这与此问题非常相似,您可以在我的回答中提到第3点.
Cop*_*oad 13
屏幕截图(空安全):
完整代码:
这是ParentPage:
class ParentPage extends StatefulWidget {
@override
_ParentPageState createState() => _ParentPageState();
}
class _ParentPageState extends State<ParentPage> {
int _count = 0;
// Pass this method to the child page.
void _update(int count) {
setState(() => _count = count);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
Text('Value (in parent) = $_count'),
ChildPage(update: _update),
],
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
这是ChildPage:
class ChildPage extends StatelessWidget {
final ValueChanged<int> update;
ChildPage({required this.update});
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () => update(100), // Passing value to the parent widget.
child: Text('Update (in child)'),
);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道您需要针对您的特定代码的解决方案,但我建议您查看 BloC 模式,因为当您想要将状态更改从小部件传递到另一个(尤其是多个页面)时,它是推荐的方法
想法很简单,尽管实现有点复杂