繁体   English   中英

Flutter 最佳实践 - 如何从其 state 调用有状态小部件的动态方法?

[英]Flutter best practices - How to call a dynamic method of a stateful widget from its state?

我想知道当您需要从 state 调用有状态小部件内部的动态方法时,最佳实践是什么。

我的意思是,我有一个通用的有状态小部件,它在参数中接收 function。 当我从它的 state 调用它时,Lint 告诉我必须避免调用动态目标。 那我该怎么做呢?

这是我的 class 目前是如何实现的

class MyStatefulWidget<T> extends extends StatefulWidget {
  final Function buttonFunction;
  final T functionParameter;

  const MyStatefulWidget(
      {Key key,
      this.buttonFunction,
      this.functionParameter})
      : super(key: key);

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

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
@override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
          leading: IconButton(
            icon: const Icon(Icons.ac_unit),
            onPressed: () {
              widget.buttonFunction(widget.functionParameter);
            },
          ),
          title: Text("Some text"),
        ),
      ),
      body:...
}

非常感谢您给我建议。

我认为如果你只在小部件内部传递一个回调然后用外部参数调用你的 function 会更好

class MyStatefulWidget extends StatefulWidget {
  final VoidCallback onTap;

  const MyStatefulWidget({Key key, this.onTap}) : super(key: key);

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

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: const Icon(Icons.ac_unit),
          onPressed: widget.onTap,
        ),
        title: Text("Some text"),
      ),
    );
  }
}

在父 class 的某处添加:

  void _onTap() {
    // call your function with parameter
  }

或者,如评论@dees91 中所述

class MyStatefulWidget<T> extends StatefulWidget {
  final ValueChanged<T> onTap;
  final T parameter;

  const MyStatefulWidget({Key key, @required this.onTap, this.parameter}) : super(key: key);

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

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: IconButton(
          icon: const Icon(Icons.ac_unit),
          onPressed: () => widget.onTap(widget.parameter),
        ),
        title: Text("Some text"),
      ),
    );
  }
}

在父小部件的某个地方

MyStatefulWidget<String>(onTap: _onTap, parameter: 'lets say its string')

和水龙头处理程序

  void _onTap(String parameter) {
    // call your function with parameter
  }

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM