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

时间:2017-05-06 14:57:19

标签: dart flutter

请看一下这段代码:

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

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

实现此目标的最简单方法是在该按钮上使用performClick()。例如,Android知道这一点。然而,Flutter没有这样的方法。所以,我这样做是:

onSubmitted: (newValue) {
  setState(() {
    strTemperature = newValue.trim();
    calculate.onPressed();
  });
},

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

1 个答案:

答案 0 :(得分:2)

也许最好创建一个可以从按钮和文本字段调用的方法(例如下面的例子)。我只是认为你的实现看起来并不好。在我看来,文本字段应该不会调用按钮的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,
        ],
      ),
    );
  }
}