【问题标题】:how to execute the VoidCallback in flutter如何在颤动中执行 VoidCallback
【发布时间】:2018-12-22 08:53:27
【问题描述】:

我正在尝试测试VoidCallback,因此我创建了主文件,该文件具有从小部件中的平面按钮调用的函数,该函数位于单独的文件中,但不起作用。

ma​​in.dart

import 'package:flutter/material.dart';
import 'controller_test.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Retrieve Text Input',
      home: MyCustomForm(),
    );
  }
}

// Define a Custom Form Widget
class MyCustomForm extends StatefulWidget {
  @override
  _MyCustomFormState createState() => _MyCustomFormState();
}

class _MyCustomFormState extends State<MyCustomForm> {
  final myController = TextEditingController();

  @override
  void initState() {
    super.initState();

    myController.addListener(_printLatestValue);
  }

  _printLatestValue() {
    print("Second text field: ${myController.text}");
  }

  _test() {
    print("hi there");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Retrieve Text Input'),
      ),
      body: Con(_test, myController)
    );
  }
}

controller_test.dart

import 'package:flutter/material.dart';

class Con extends StatelessWidget {
  Con(this.clickCallback, this.tc);
  final TextEditingController tc;
  final VoidCallback clickCallback;

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        children: <Widget>[
          TextField(
            onChanged: (text) {
              print("First text field: $text");
            },
          ),
          TextField(
            controller: tc,
          ),
          FlatButton(
            onPressed: () => clickCallback,
            child: Text("click me"),
          )
        ],
      ),
    );
  }
}

当我点击小部件中的 FlatButton 时,什么都没有发生,我期待 hi there 被打印出来

【问题讨论】:

    标签: dart flutter


    【解决方案1】:

    这里有两个选项。

    1. onPressed: () =&gt; fun() 就像 onPressed 参数是一个调用 fun 的匿名方法。

    2. onPressed: fun 就像 onPressed 参数是函数的乐趣。

    【讨论】:

    • 当只有一个函数可以做的时候,让它成为一个回调函数有什么意义?
    【解决方案2】:

    我刚刚在另一个答案here 中找到它 我错过了 (),所以正确的调用是:

          FlatButton(
            onPressed: () => clickCallback(),
            child: Text("click me"),
          )
    

    【讨论】:

    • 你甚至可以写 onPressed: clickCallback,
    • 在这种情况下很容易忘记 () :|不带 () 的另一种方法也不错。
    【解决方案3】:

    如果有任何变量发生变化,请确保在您的回调中调用 setState。我在提供程序中重新填充了一个列表,然后将该列表分配给我转换为卡片列表的变量列表。变量列表需要刷新状态才能看到。

    【讨论】:

      【解决方案4】:

      您可以使用 Voidcallback 类从无状态小部件获取回调到当前页面。

      只需在当前页面中添加这个自定义小部件(widget.build() 函数)

      DefaultButton(
              buttonText: Constants.LOGIN_BUTTON_TEXT,
              onPressed: () => validateInputFields(),
              size: size,
            );
      

      我的自定义小部件类是

      class DefaultButton extends StatelessWidget {
      
        DefaultButton({this.buttonText, this.onPressed, this.size});
      
        final String buttonText;
        final VoidCallback onPressed;
        final Size size;
      
        @override
        Widget build(BuildContext context) {
          return MaterialButton(
            minWidth: size.width,
            onPressed: () => onPressed(), //callback to refered page
            padding: EdgeInsets.all(0.0),
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(DEFAULT_BORDER_RADIUS),
            ),
            child: Ink(
              width: size.width,
              decoration: BoxDecoration(
                gradient: LinearGradient(
                  begin: Alignment.centerLeft,
                  end: Alignment.centerRight,
                  colors: <Color>[
                    SECONDARY_COLOR_SHADE_LITE,
                    SECONDARY_COLOR_SHADE_DARK,
                  ],
                ),
                borderRadius: BorderRadius.circular(DEFAULT_BORDER_RADIUS),
              ),
              child: Padding(
                  padding: EdgeInsets.only(left: 20, right: 20, top: 12, bottom: 12),
                  child: Text(
                    buttonText,
                    style: Theme.of(context).textTheme.button,
                    textAlign: TextAlign.center,
                  )),
            ),
          );
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-01
        • 2022-07-15
        • 2019-09-24
        • 2023-03-07
        • 2019-12-06
        相关资源
        最近更新 更多