在flutter中开发中,会发现当子类Widget是StatefulWidget类型的时候,想要获取它的State并调用State中的方法,感觉无从下手。不像是在iOS中,可以直接调用一个类的公开的方法,flutter可以通过key来实现。每个Widget都是唯一标识的。此唯一标识对应于可选的Key参数。如果省略,Flutter将为您生成一个。key主要分为四种:GlobalKey,LocalKey,UniqueKey或ObjectKey,GlobalKey确保key是在整个应用程序唯一的,这次我们就要使用它来实现。
我们需要给子Widget定义一个唯一的GlobalKey,然后根据这个key获取到这个Widget,进行相关的操作,下面是相关的代码:
import 'package:flutter/material.dart';
class FirstView extends StatefulWidget {
@override
_FirstViewState createState() => _FirstViewState();
}
class _FirstViewState extends State<FirstView> {
//这里就是关键的代码,定义一个key
GlobalKey<_ChildViewState> _childViewKey = new GlobalKey<_ChildViewState>();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("First"),
),
body: Container(
//将key值传进去
child: ChildView(key: _childViewKey)
),
floatingActionButton: FloatingActionButton(
onPressed: (){
//调用方法
_childViewKey.currentState.add();
},
),
);
}
}
class ChildView extends StatefulWidget {
ChildView({Key key}) : super(key: key);
@override
_ChildViewState createState() => _ChildViewState();
}
class _ChildViewState extends State<ChildView> {
int _counter = 0;
@override
Widget build(BuildContext context) {
return Container(
child: Text("数量是: $_counter"),
);
}
add() {
setState(() {
_counter++;
});
}
}
网友评论