2017-05-06 126 views
0

請看看下面的代碼段:使用Flutter,模擬FlatButton點擊的正確方法是什麼?

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

當單擊該按鈕,setState()用,做一個分配和方法調用一個lambda調用。完美的作品。我想要做的是,如果提交了文本字段,則執行相同的setState()

實現此目的的最簡單方法是按鈕上的performClick()。例如,Android知道這一點。但是,Flutter沒有這樣的方法。所以,我做的是這樣的:

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

這個工程也很好。我的問題是:可以自己調用onPressed()回調嗎?有我的代碼可能會破壞的場景嗎?

回答

1

也許最好是創建一個可以從按鈕和文本字段中調用的方法(下面的例子)。我只是覺得你的實現看起來不太好。在我看來,textfield應該不會調用按鈕的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, 
     ], 
    ), 
    ); 
    } 
} 
+0

Rainer,謝謝。你當然是對的,我的解決方案看起來有點像解決方法。 :-)將幾行共享代碼重構成一個方法,並從onPressed()和onSubmitted()調用它是一個乾淨而漂亮的解決方案。讓我們看看其他人是否提出了其他建議。 – Thomas

+0

Rainer的建議對我來說看起來不錯,我贊成 –

+0

......現在已被接受。 ;-) 多謝你們。 – Thomas

相關問題