如何解决Flutter:从onother文件的父类调用子类函数
问题: 如何从IconButton的onPressed()调用methodA()。 我尝试通过使用GlobalKey来做到这一点: GlobalKey <_mybuttonstate> globalKey = GlobalKey(); 但这会返回错误。
我已经阅读了很多关于此的论坛,并且尝试了所有提出的解决方案,但是没有一个对我有用。
代码:
main.dart
import 'package:flutter/material.dart';
import 'button.dart';
void main() {
runApp(MaterialApp( title: 'My app',home: MyApp(),));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
leading: IconButton(
icon: Icon(Icons.help),onPressed: () {
// how can I call methodA from here?
},),body: HomePage(),);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Center(
child: MyButton(),);
}
}
button.dart
import 'package:flutter/material.dart';
class MyButton extends StatefulWidget {
@override
_MyButtonState createState() => _MyButtonState();
}
class _MyButtonState extends State<MyButton> {
@override
Widget build(BuildContext context) {
return Container( );
}
void methodA(){
print('methodA');
}
}
我已经阅读了很多关于此的论坛,并且尝试了所有提出的解决方案,但是没有一个对我有用。
解决方法
首先,您必须在package
中将文件作为main.dart
导入:
Main.dart :(只是编写导入文件的方式)
import 'package:prioject_name/file_name.dart';
注意:这是针对lib
目录下的文件的。
如果您的文件位于lib
内的其他目录下
然后相应地添加路径,
例如:Button.dart在lib文件夹内的widgets文件夹内:
lib
|____widgets
|____Button.dart
然后导入语句将如下:
import 'package:prioject_name/widgets/Button.dart';
然后尝试使用全局键方法来调用该函数:
如果仍然无法使用,则可以使用我的方法,
如何在class
或onPressed
中调用来自不同onTapped
的方法:
您的Button.dart文件。
import 'package:flutter/material.dart';
// changed the method definition class
class MyButton extends StatefulWidget {
void methodA(){
print('methodA');
}
@override
_MyButtonState createState() => _MyButtonState();
}
class _MyButtonState extends State<MyButton> {
@override
Widget build(BuildContext context) {
...
widget.methodA(); // this would call the method A,anywhere inside the Widget build() function.
return Container( );
}
}
现在在Main.dart中:
import 'package:prioject_name/Button.dart';
//call the function here using className().functioName();
....
onPressed(){
MyButton().methodA();
}
,
看看InheritedWidget类(并观看视频)。
widget的基类,这些widget有效地将信息向下传播 树。
您可以查看创建一个包含InheritedWidget
的{{1}}。
ValueNotifier
您的class MyInheritedWidget extends InheritedWidget {
final ValueNotifier<int> buttonTapCountNotifier;
const MyInheritedWidget({
Key key,@required this.buttonTapCountNotifier,@required Widget child,}) : assert(child != null),super(key: key,child: child);
static MyInheritedWidget of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<MyInheritedWidget>();
}
}
类可以调用MyButton
来获取MyInheritedWidget.of(context).buttonTapCountNotifier
并为其添加一个侦听器。
每次ValueNotifier
通知您的ValueNotifier
类该值已增加时,您都可以执行MyButton
。
您可以使用Provider软件包,这是在Flutter应用程序中管理状态的首选方法。这也将帮助您以一种聪明的方式组织和扩展应用程序。
看看下面的工作代码。
- 定义一个 ChangeNotifier (PressedProvider),它将保存 唯一位置的应用程序当前状态以及onPress函数的行为
- 您包装好应用程序 使用 ChangeNotifierProvider 小部件
- 您包裹收货 具有消费者 的小部件
- 您获得 Provider.of() 需要做点事情并在上面调用方法
- 它将通知消费者更改
代码:
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
final Color darkBlue = Color.fromARGB(255,18,32,47);
void main() {
runApp(ChangeNotifierProvider<PressedProvider>( // 2
create: (_) => PressedProvider(),child: MyApp(),));
}
class PressedProvider extends ChangeNotifier { // 1
void pressButton() {
print("pressButton");
notifyListeners();
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),debugShowCheckedModeBanner: false,home: Scaffold(
appBar: AppBar(
leading: Consumer<PressedProvider>( // 3
builder: (_,provider,widget) => IconButton(
icon: Icon(Icons.help),onPressed: () {
provider.pressButton();
},),body: Center(
child: MyButton(),);
}
}
class MyButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
PressedProvider provider = Provider.of<PressedProvider>(context); // 4
return Center(
child: RawMaterialButton(
child: Text("Press me"),onPressed: () => provider.pressButton()),);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。