使用 Flutter,模拟 FlatButton 的点击的正确方法是什么?

5 dart flutter

请看一下这段代码片段:

final calculate = new FlatButton(
  child: new Text(_calculate),
  onPressed: _valid
      ? () {
          setState(() {
            model.inTemperature = stringToDouble(strTemperature);
            model.calculateOutTemperature();
          });
        }
      : null);
Run Code Online (Sandbox Code Playgroud)

单击按钮时,setState()会使用执行赋值和方法调用的 lambda 进行调用。完美运行。我想要做的是,如果提交了文本字段,setState()则执行相同的操作。

实现这一目标的最简单方法是performClick()在那个按钮上。例如,Android 知道这一点。但是,Flutter 没有这样的方法。所以,我要做的是:

onSubmitted: (newValue) {
  setState(() {
    strTemperature = newValue.trim();
    calculate.onPressed();
  });
},
Run Code Online (Sandbox Code Playgroud)

这也很好用。我的问题是:可以自己调用onPressed()回调吗?是否存在我的代码可能会中断的情况?

Rai*_*ann 4

也许创建一个可以从按钮和文本字段调用的方法会更好(下面的示例)。我只是觉得你的实现看起来不太好。在我看来,文本字段不应该调用按钮的 onPressed 。不过,我不认为有任何情况会破坏这种情况。

也许是这样的?

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      home: new MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  static void _setTemperature() {
    setState(() {
      model.inTemperature = stringToDouble(strTemperature);
      model.calculateOutTemperature();
    });
  }

  final calculate = new FlatButton(
    child: new Text(_calculate),
    onPressed: _valid ? () => _setTemperature() : null,
  );

  final textField = new TextField(
    controller: _controller,
    onSubmitted: (newValue) {
      setState(() {
        strTemperature = newValue.trim();
        _setTemperature();
      });
    },
  );
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('TestProject'),
      ),
      body: new Column(
        children: <Widget>[
          calculate,
          textField,
        ],
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)