简体   繁体   English

如何从有状态小部件内的有状态小部件调用方法

[英]How do I call a method from a stateful widget inside of a stateful widget

I am trying to clean up my code and want to place one of my methods from a stateful widget inside of a different class that is also a stateful widget but whenever I try to call the method it does not recognize it unless the class that I am calling it from it a stateless widget.我正在尝试清理我的代码,并希望将我的一个方法从一个有状态小部件放在另一个类中,该类也是一个有状态小部件,但是每当我尝试调用该方法时,它都无法识别它,除非我所在的类将其称为无状态小部件。 I was wondering what the best way to get around this would be without changing the class?我想知道在不改变课程的情况下解决这个问题的最佳方法是什么?

Here is a simple example of my problem, I am trying to call exampleStatefulWidget.testWidget() inside of MyHomePage which is a stateful widget.这是我的问题的一个简单示例,我试图在MyHomePage内部调用MyHomePage exampleStatefulWidget.testWidget() ,这是一个有状态的小部件。

import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}
ExampleStatefulWidget exampleStatefulWidget = ExampleStatefulWidget();
ExampleStatelessWidget exampleStatelessWidget = ExampleStatelessWidget();

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Test'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
        exampleStatefulWidget.testWidget(), // Can not call method that is inside of a stateful widget
        exampleStatelessWidget.testWidget(); // Will call method but only if inside of a stateless widget
        },
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class ExampleStatefulWidget extends StatefulWidget {
  const ExampleStatefulWidget({Key? key}) : super(key: key);

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

class _ExampleStatefulWidgetState extends State<ExampleStatefulWidget> {
  MyHomePage myHomePage = MyHomePage();

  Widget testWidget() {
    return Container(); // Do Something
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

class ExampleStatelessWidget extends StatelessWidget {
  const ExampleStatelessWidget({ Key? key }) : super(key: key);

  Widget testWidget() {
    return Container(); // Do Something
  }
  
  @override
  Widget build(BuildContext context) {
    return Container(
      
    );
  }
}

ExampleStatefulWidget and _ExampleStatefulWidgetState are different class, you can create instance of _ExampleStatefulWidgetState instead. ExampleStatefulWidget_ExampleStatefulWidgetState是不同的类,您可以创建_ExampleStatefulWidgetState实例来代替。 And use the method.并使用方法。

_ExampleStatefulWidgetState exampleStatefulWidget =
    _ExampleStatefulWidgetState();

In this case, uses will be like在这种情况下,用途将类似于

_MyHomePageState _MyHomePageState

class _MyHomePageState extends State<MyHomePage> {
  Widget? widgetFromMethod;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Test'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            if (widgetFromMethod != null) widgetFromMethod!,
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          exampleStatelessWidget
              .testWidget(); // Will call method but only if inside of a stateless widget
          final gotWidget = exampleStatefulWidget.testWidget();

          setState(() {
            widgetFromMethod = gotWidget;
          });
        },
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

_ExampleStatefulWidgetState _ExampleStatefulWidgetState

class _ExampleStatefulWidgetState extends State<ExampleStatefulWidget> {
  MyHomePage myHomePage = MyHomePage();

  Widget testWidget() {
    return Container(
      color: Colors.purple,
      width: 100,
      height: 100,
      child: Text("generated method from statefull"),
    ); // Do Something
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

if _ExampleStatefulWidgetState are on separate file, make it public removing _ .如果_ExampleStatefulWidgetState位于单独的文件中,请公开删除_ it will be ExampleStatefulWidgetState它将是ExampleStatefulWidgetState

Calling a printLog method of SecondWidget (Child) from FirstWidget(Parent)从 FirstWidget(Parent) 调用 SecondWidget (Child) 的 printLog 方法

Note : This is not recommended.注意:不推荐这样做。 Use any state management lib to achive this (flutter_bloc, provider etc)使用任何状态管理库来实现这一点(flutter_bloc、提供者等)

import 'package:flutter/material.dart';

class FirstWidget extends StatefulWidget {
  @override
  _FirstWidgetState createState() => _FirstWidgetState();
}

class _FirstWidgetState extends State<FirstWidget> {
  final key = GlobalKey<_SecondWidgetState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Container(
          alignment: Alignment.center,
          child: Column(
            children: [
              ElevatedButton(
                onPressed: () {
                  key.currentState?.printLog();
                },
                child: Text("Click"),
              ),
              SecondWidget(key)
            ],
          ),
        ),
      ),
    );
  }
}

class SecondWidget extends StatefulWidget {
  SecondWidget(Key key) : super(key: key);

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

class _SecondWidgetState extends State<SecondWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(padding: EdgeInsets.all(20), child: Container());
  }

  void printLog() {
    print("I am called");
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从另一个有状态小部件调用一个有状态小部件中的方法 - how to Call method in one stateful widget from another stateful widget 从另一个有状态小部件调用一个有状态小部件中的方法 - Flutter - call method in one stateful widget from another stateful widget - Flutter Flutter,如何从返回的 Widget 调用 Stateful Widget 内部的函数? - Flutter, how to call a function inside Stateful Widget from a returned Widget? 如何在另一个有状态小部件中调用方法 - How to call a method in another stateful widget 如何从有状态小部件调用 function - How to call function from Stateful widget 如何在有状态小部件之外调用有状态小部件的方法 - How to Call Method of statefull Widget out side of the stateful widget 如何从有状态小部件中获取参数 - How to do I get a parameter from a stateful widget 如何从父小部件在子有状态小部件内运行函数? - How to run a function inside a child stateful widget from parent widget? 如何使用来自另一个 Widget 的 Stateful Widget 中的方法 - How to use a method in a Stateful Widget from another Widget 如何通过引用状态小部件传递数据? 我想在有状态的小部件内更改变量并更新原始变量 - How to pass data by reference to stateful widget? I want to change a variable inside a stateful widget and update original variable
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM