我的 ElevatedButton 小部件不会更新它们应该为程序的其余部分更新的变量

问题描述 投票:0回答:2
`import 'package:flutter/material.dart';

class SkillEntry extends StatefulWidget {
   const SkillEntry({super.key, required this.skll});

   final String skll;

  @override
  State<SkillEntry> createState() => _SkillEntryState();
}

class _SkillEntryState extends State<SkillEntry> {


  @override
  Widget build(BuildContext context) {

     int skillvalue = 0;

    return Container(
        height: 40,
        width: 200,
        child: Row(children: [
          const Flexible(flex: 20, child:
          TextField(decoration:(
              InputDecoration(
                  border: OutlineInputBorder(),
                  hintText: ('Name and Skill'))),)),
          ElevatedButton(onPressed: PlusOne(skillvalue), child: Icon(Icons.add_circle)),
          ElevatedButton(onPressed: MinusOne(skillvalue), child: Icon(Icons.exposure_minus_1)),
          Flexible(flex: 7, child:
           Text('$skillvalue',)),
        ]));
  }
  PlusOne(skillvalue) {
    setState(() {
      skillvalue = skillvalue + 1;
      return skillvalue;
      });
  }

  MinusOne(skillvalue) {
    setState(() {
      skillvalue = skillvalue - 1;
      return skillvalue;
    });
  }
}

就目前情况而言,这些按钮似乎没有任何作用。我怀疑我将

skillvalue
变量放入函数
PlusOne
中,但没有正确地将其返回到主程序,或者我可能没有正确使用
setstate
。我该如何解决这个问题?

flutter button callback setstate
2个回答
0
投票

问题是你的

skillValue
是在你的 build 方法中声明的 :

@override Widget build(BuildContext context) { int skillvalue = 0;
并且 

build

 方法每隔 
setState
 重新运行一次。因此,每次更新 UI 时,
skillValue
 都会重置为您设置的值。

要解决该问题,请将

skillValue

 移至 
State
 类中:

class _SkillEntryState extends State<SkillEntry> { int skillvalue = 0; ...
代替

build

方法


0
投票
首先,

skillValue

是在
build
方法中声明的,其值始终为零。

其次,你使用

ElevatedButton

的方式是错误的,你不能使用void方法返回值作为
onPressed
的参数,这意味着
onPressed
始终为空。

这是我的演示代码。

class SkillEntry extends StatefulWidget { const SkillEntry({super.key, required this.skll}); final String skll; @override State<SkillEntry> createState() => _SkillEntryState(); } class _SkillEntryState extends State<SkillEntry> { int skillvalue = 0; @override Widget build(BuildContext context) { return Container( height: 40, width: 200, child: Row(children: [ const Flexible(flex: 20, child: TextField(decoration:( InputDecoration( border: OutlineInputBorder(), hintText: ('Name and Skill'))),)), ElevatedButton(onPressed: PlusOne, child: Icon(Icons.add_circle)), ElevatedButton(onPressed: MinusOne, child: Icon(Icons.exposure_minus_1)), Flexible(flex: 7, child: Text('$skillvalue',)), ])); } PlusOne() { setState(() { skillvalue = skillvalue + 1; }); } MinusOne() { setState(() { skillvalue = skillvalue - 1; }); } }
    
© www.soinside.com 2019 - 2024. All rights reserved.