我需要在页面浏览量中调用另一个类的方法的帮助。我有一个应用程序,它的综合浏览量由两个类分别为Page 1和Page 2组成。它们都是有状态的小部件。
我试图从Page1的Page2中调用一个方法,但是这对我来说很困难,因为它们都不具有子/父关系,因此我无法使用回调函数。实际上,它们都是另一个父类(MainParent)的孩子。我尝试使用globalkey,但是收到currentState为null错误。
非常感谢您的帮助。谢谢!
class MainParent extends StatefulWidget{
@override
MainParentState createState() => MainParentSate();
}
class MainParentState extends State<MainParent> {
PageController pageController;
@override
initState(){
pageController = new PageController(
}
List<Widget> _showPageList(AppModel appModel){
List<Widget> pageList = new List();
pageList.add(Page1(/*some named parameters pass here*/));
pageList.add(Page2(/*some named parameters pass here*/));
return pageList;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: PageView(
physics: new NeverScrollableScrollPhysics(),
controller: pageController,
onPageChanged: _onPageChanged,
children: _showPageList(),
)
);
}
}
第1页的课程
class Page1 extends StatefulWidget{
@override
Page1State createState() => Page1State();
}
class Page1State extends State<Page1> {
_callPage2Function(){
//animate to page 2 and mount it
MainParent.of(context).pageController.animateToPage(
1,
duration: const Duration(milliseconds: 700),
curve: Curves.fastLinearToSlowEaseIn);
//this doesn't work
Page2State page2state = new Page2State();
page2state.refreshList();
//creating a global key doesnt work as well, gets currentstate is null
GlobalKey<Page2State> page2Key = new GlobalKey<Page2State>();
page2Key.currentState.refreshList();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: GestureDetector(
onTap: () => _callPage2Function()
)
)
);
}
}
第2页课程
class Page2 extends StatefulWidget{
@override
Page2State createState() => Page2State();
}
class Page2State extends State<Page2> {
refreshList(){
//this function refreshes the list
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: ListView.builder(
//some child widgets here
)
)
);
}
}
编辑:编辑了我的代码。原来,我必须先导航到page2选项卡,因为当我位于第1页时,第2页未安装到屏幕上。因此,我添加了pageController并首先导航到page2。
答案 0 :(得分:0)
您的代码中的错误是在使用键时没有将键注入到Page2实例中,这就是为什么currentState为null的原因。 通常,当我想实现这一目标时,我会像这样使用key属性
class Page2 extends StatefulWidget {
static final GlobalKey<Page2State> staticGlobalKey =
new GlobalKey<Page2State>();
Page2() : super(key: Page2.currentStateKey); // Key injection
@override
Page2State createState() => Page2State();
}
class Page2State extends State<Page2> {
refreshList() {
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
child: ListView.builder(
//some child widgets here
)));
}
}
然后从您应用程序中的任何位置调用refreshList()即可
Page2.staticGlobalKey.currentState.refreshList();
您可以解决并使用其他方法代替静态密钥,但这应该是可行的解决方案。
答案 1 :(得分:0)
在PageView
中,一次只有一页mounted
(或处于活动状态)。
在这里,当您从page2Key.currentState.refreshList();
呼叫Page1
时,Page2
当前为unmounted
(或无效)。因此状态本身为null。
因此您不能在另一页上setState
。