Flutter 如何在颤振中调用状态类中的方法?

Flutter 如何在颤振中调用状态类中的方法?,flutter,dart,Flutter,Dart,我想从HomeState类调用方法到_MyHomePageState类,但我不知道怎么做 这是main.dart: import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp(

我想从HomeState类调用方法到_MyHomePageState类,但我不知道怎么做

这是main.dart:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
Home home = new Home();  
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(         
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: (){}
      ), 
    );
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
家=新家();
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子栏(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
],
),
),
浮动操作按钮:浮动操作按钮(
onPressed:(){}
), 
);
}
}
家庭班级:

class Home extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return HomeState();
  }
}

class HomeState extends State<Home> {

  int numberPrint(){
    setState((){});
  }

  @override
  Widget build(BuildContext context) { 
  }
}
class Home扩展StatefulWidget{
@凌驾
状态createState(){
返回家园();
}
}
类HomeState扩展到State{
int numberPrint(){
setState((){});
}
@凌驾
小部件生成(BuildContext上下文){
}
}
我想在main.dart中的_MyHomePageState类中调用floatingbutton中的numberPrint()方法。
请帮我做这件事。

请看看我是如何处理的,这不是最好的,但会给你一个更好的主意

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}
//MyHomePage---------------------------------------------------
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  MyController controller = MyController();
  @override
  Widget build(BuildContext context) {    
Home home = new Home(controller:controller);  
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(         
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: controller.execute,
      ), 
    );
  }
}
//Home---------------------------------------------------------------------
class Home extends StatefulWidget {
  Home({this.controller});
  final MyController controller;
  @override
  State<StatefulWidget> createState() {
    return HomeState();
  }
}

class HomeState extends State<Home> {
  initState(){
    widget.controller.addListener(numberPrint);
  }
  
  numberPrint(){
    setState((){});
  }

  @override
  Widget build(BuildContext context) { 
  }
}

//MyController--------------------------------------------------------
class MyController{
  Function listener;
  addListener(Function fn){
    listener = fn;
  }
  
  execute(){
    listener();
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
//我的主页---------------------------------------------------
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
MyController controller=MyController();
@凌驾
小部件生成(BuildContext上下文){
主页=新主页(控制器:控制器);
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子栏(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
],
),
),
浮动操作按钮:浮动操作按钮(
onPressed:controller.execute,
), 
);
}
}
//家---------------------------------------------------------------------
类Home扩展了StatefulWidget{
主页({this.controller});
最终控制器;
@凌驾
状态createState(){
返回家园();
}
}
类HomeState扩展到State{
initState(){
widget.controller.addListener(numberPrint);
}
numberPrint(){
setState((){});
}
@凌驾
小部件生成(BuildContext上下文){
}
}
//霉菌控制者--------------------------------------------------------
类MyController{
函数侦听器;
addListener(函数fn){
监听器=fn;
}
执行(){
监听器();
}
}

请看看我是如何处理的,这不是最好的,但会给你一个更好的主意

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}
//MyHomePage---------------------------------------------------
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  MyController controller = MyController();
  @override
  Widget build(BuildContext context) {    
Home home = new Home(controller:controller);  
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(         
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: controller.execute,
      ), 
    );
  }
}
//Home---------------------------------------------------------------------
class Home extends StatefulWidget {
  Home({this.controller});
  final MyController controller;
  @override
  State<StatefulWidget> createState() {
    return HomeState();
  }
}

class HomeState extends State<Home> {
  initState(){
    widget.controller.addListener(numberPrint);
  }
  
  numberPrint(){
    setState((){});
  }

  @override
  Widget build(BuildContext context) { 
  }
}

//MyController--------------------------------------------------------
class MyController{
  Function listener;
  addListener(Function fn){
    listener = fn;
  }
  
  execute(){
    listener();
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
//我的主页---------------------------------------------------
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
MyController controller=MyController();
@凌驾
小部件生成(BuildContext上下文){
主页=新主页(控制器:控制器);
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子栏(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
],
),
),
浮动操作按钮:浮动操作按钮(
onPressed:controller.execute,
), 
);
}
}
//家---------------------------------------------------------------------
类Home扩展了StatefulWidget{
主页({this.controller});
最终控制器;
@凌驾
状态createState(){
返回家园();
}
}
类HomeState扩展到State{
initState(){
widget.controller.addListener(numberPrint);
}
numberPrint(){
setState((){});
}
@凌驾
小部件生成(BuildContext上下文){
}
}
//霉菌控制者--------------------------------------------------------
类MyController{
函数侦听器;
addListener(函数fn){
监听器=fn;
}
执行(){
监听器();
}
}

一般来说,我使用某种页面神经中枢,通过它小部件可以注册它们的
setState
函数或其他东西,例如
FocusNode
甚至数据

比如说,

class PageNerveCenter{
  Function requireHomeRebuild;
}

PageNerveCenter _pageNerveCenter = PageNerveCenter();

class Home extends StatefulWidget{...}

class _HomeState extends State<Home>{

...
  @override
  initState(){
    super.initState();
    // register setState 
    _pageNerveCenter.requireHomeRebuild = (){
      setState((){}) 
    };
  }

  @override
  dispose(){
    // remove setState when object is disposed
    _pageNerveCenter.requireHomeRebuild = (){};
  }

...

}

然后,这种方法允许您从文件中的任何位置,从另一个小部件内部调用小部件的
setState

根据我自己的经验,这种方法有助于轻松分解我的小部件树,只重建那些实际上也需要重建的小部件

我当然想听听其他更有经验的fl