Flutter 直到我选择了一个下拉项,即使在指定了一个默认值之后,升起的按钮也不会显示答案

Flutter 直到我选择了一个下拉项,即使在指定了一个默认值之后,升起的按钮也不会显示答案,flutter,button,drop-down-menu,Flutter,Button,Drop Down Menu,我正在制作一个简单的S.I计算器,它有一个用于本金和时间的字段,同时我还有一个下拉列表来选择货币。 问题是当我按下“calculate”(计算)RaisedButton(上升按钮)时,查看图像可能会帮助屏幕上没有显示任何内容最初我认为Button有问题,但后来我发现,在按下RaisedButton(上升按钮)后,如果我从下拉列表中选择了任何项目,则会出现答案为什么会发生这种情况,我已将初始值设置为_selected='rupe'我做错什么了吗 import 'package:flutter/ma

我正在制作一个简单的S.I计算器,它有一个用于本金和时间的字段,同时我还有一个下拉列表来选择货币。 问题是当我按下“calculate”(计算)RaisedButton(上升按钮)时,查看图像可能会帮助屏幕上没有显示任何内容最初我认为Button有问题,但后来我发现,在按下RaisedButton(上升按钮)后,如果我从下拉列表中选择了任何项目,则会出现答案为什么会发生这种情况,我已将初始值设置为_selected='rupe'我做错什么了吗

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Simple Intrest Calculator',
      home: MyHomePage(),
      theme: ThemeData(
        brightness: Brightness.dark,
        primaryColor: Colors.indigo,
        accentColor: Colors.indigoAccent,
      ),
    );
  }
}

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

class _MyHomePageState extends State<MyHomePage> {
  var _currencies = ['Rupee', 'Dollar', 'Pound'];
  final _minPadding = 5.0;
  var _selected = 'Rupee';

  TextEditingController principalCntr = TextEditingController();
  TextEditingController roiCntr = TextEditingController();
  TextEditingController termCntr = TextEditingController();
  
  String _amount = '0';
  
  @override
  Widget build(BuildContext context) {
    
    TextStyle styles = Theme.of(context).textTheme.headline6;
    
    return Scaffold(
      //resizeToAvoidBottomPadding: false,
      appBar: AppBar(
        title: Text('S.I Calculator'),
        centerTitle: true,
      ),
      body: Container(
        margin: EdgeInsets.symmetric(vertical: 0, horizontal: _minPadding * 2),
        child: ListView(
          children: [
            getImg(),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 5),
              child: TextField(
                controller: principalCntr,
                keyboardType: TextInputType.number,
                style: styles,
                decoration: InputDecoration(
                  labelText: 'Principal',
                  hintText: 'Enter principal amount',
                  labelStyle: styles,
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(5.0),
                  ),
                ),
              ),
            ),
            Padding(
              padding: const EdgeInsets.symmetric(vertical: 5),
              child: TextField(
                controller: roiCntr,
                keyboardType: TextInputType.number,
                style: styles,
                decoration: InputDecoration(
                  labelText: 'Intrest',
                  hintText: 'Enter intrest rate',
                  labelStyle: styles,
                  border: OutlineInputBorder(
                    borderRadius: BorderRadius.circular(5.0),
                  ),
                ),
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                children: [
                  Expanded(
                    child: TextField(
                      controller: termCntr,
                      keyboardType: TextInputType.number,
                      style: styles,
                      decoration: InputDecoration(
                        labelText: 'Time',
                        hintText: 'Time in years',
                        labelStyle: styles,
                        border: OutlineInputBorder(
                          borderRadius: BorderRadius.circular(5.0),
                        ),
                      ),
                    ),
                  ),
                  SizedBox(width: 50,),
                  Expanded(
                    child: DropdownButton(
                      value: _selected,
                      onChanged: (newVal) {
                        setState(() {
                          _selected = newVal;
                        });
                      },
                      items: _currencies.map((selectedVal) {
                        return DropdownMenuItem(
                          value: selectedVal,
                          child: Text(selectedVal),
                        );
                      }).toList(),
                    ),
                  ),
                ],
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Row(
                children: [
                  Expanded(
                    child: RaisedButton(
                      color: Theme.of(context).accentColor,
                      textColor: Theme.of(context).primaryColor,
                      child: Text('Calculate'),
                      onPressed: (){
                        _amount = _calculateReturns();
                      },
                    ),
                  ),
                  SizedBox(width: 20),
                  Expanded(
                    child: RaisedButton(
                      color: Theme.of(context).primaryColorDark,
                      textColor: Theme.of(context).primaryColorLight,
                      child: Text('Clear', style: TextStyle(fontSize: 20,),),
                      onPressed: (){
                        debugPrint('pressed');
                      },
                    ),
                  ),
                ],
              ),
            ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: Text(_amount, style: styles,),
            ),
          ],
        ),
      ),
    );
  }

  String _calculateReturns(){
    double principal = double.parse(principalCntr.text);
    double roi = double.parse(roiCntr.text);
    double year = double.parse(termCntr.text);

    double sI = principal + (principal*roi*year)/100;
    String res = 'After $year years, you get $sI';
    return res;
  }

  Widget getImg() {
    AssetImage img = AssetImage('images/money.jpg');
    Image image = Image(image: img, width: 125, height: 125);
    return Container(
      child: image,
      margin: EdgeInsets.all(_minPadding * 10),
    );
  }
}

这是在我点击提升按钮之后

这是在我从下拉列表中选择一个项目但不再单击按钮之后:

代码演练:

列了一张"货币清单"。 添加了文本输入字段下拉按钮和两个提升按钮。 当按下“计算”按钮时,调用“计算返回”,返回一个值并将其存储在“金额”中 输出只是一个文本小部件。
按下按钮时忘记更新屏幕,记住每次需要更改页面内容或更新页面时,都必须调用该方法:

       setState(() {   
       
       // code here for values to be updated
       });

因此,在您按下的升起按钮功能中,您必须添加如下内容:


 onPressed: (){
    _amount = _calculateReturns();
    setState(() {    });
               }


对它是这样工作的,因为setState只在下拉菜单中定义,这就是为什么选择它后会出现结果。这就是为什么它只在下拉菜单中工作的原因。