flutter - 颤动中MaterialButton上的条件highlightColor
问题描述
我正在尝试用多个按钮构建一个测验。当用户按下正确答案的按钮时,我希望按钮具有绿色的 highlightColor。如果按钮错误,则 highlightColor 为红色。我遇到的问题是,当我单击一个按钮时,会显示正确的 highlightColor,但您也会看到错误的颜色。如果我使用 splashColor 代替,那么您只会看到正确的颜色,但效果不一样。
这是代码的简化版本,只有一个按钮,但问题相同。
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State {
bool _winner = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
'Press the button:',
),
MaterialButton(
minWidth: MediaQuery.of(context).size.width * 0.90,
height: 60.0,
color: Colors.grey[800],
splashColor: Colors.transparent,
//splashColor: _winner ? Colors.green : Colors.red,
highlightColor: _winner ? Colors.green : Colors.red,
onPressed: () {
setState(() {
});
_winner ? _winner=false : _winner=true;
}
),
],
),
),
);
}
}
解决方案
这里的highlight
淡入淡出动画持续 200 毫秒并且setState
在动画结束之前被调用,这就是为什么你会看到另一种颜色的原因。
一种解决方案是setState
延迟 200 毫秒后。
onPressed: () {
Future.delayed(Duration(milliseconds: 200), () {
setState(() {});
_winner ? _winner = false : _winner = true;
});
}),
推荐阅读
- tensorflow - AttributeError:“模型”对象没有属性“目标”
- stripe-payments - 将 Stripe 客户数据从一个平台迁移到另一个平台
- r - 自动查找并设置 r 中的最佳图形尺寸?
- c++ - 解析括号表达式时提升精神核心转储
- foreach - foreach 循环的无效语法 (r198)
- python - 有没有其他方法可以使用 python 列表或任何其他功能来实现这个冗长的实现函数?
- c++ - for( auto && v : arr ) 不会破坏数组的内容吗?
- electron - 如何从我的 Electron 应用程序中打开文档(例如,“.xlsx”、“.pptx”、“.pdf”、“.docx”等类型的文件)?
- c - eeprom 变量的初始值
- excel - 索引/匹配语法正确,但查找单元格未提取值