вы делали это правильно, используя GestureDetector
, но вы использовали неправильные методы, вы использовали onLongPressStart
и onLongPressEnd
, как в примере ниже:
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool _changeColor = false;
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(scaffoldBackgroundColor: darkBlue),
debugShowCheckedModeBanner: false,
home: GestureDetector(
onLongPressStart: (_) => setState(() => _changeColor = !_changeColor),
onLongPressEnd: (_) => setState(() => _changeColor = !_changeColor),
child: Container(
color: _changeColor ? Colors.red : Colors.yellow,
child: Text('Change color'),
),
),
);
}
}
другой способ сделать это с помощью класса MaterialStateColor
, предложенного @ pskink
class MyApp extends StatelessWidget {
Color getTextColor(Set<MaterialState> states) {
const Set<MaterialState> interactiveStates = <MaterialState>{
MaterialState.pressed,
MaterialState.hovered,
MaterialState.focused,
};
if (states.any(interactiveStates.contains)) {
// the color to return when button is in pressed, hovered, focused state
return Colors.red;
}
// the color to return when button is in it's normal/unfocused state
return Colors.yellow;
}
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: FlatButton(
child: Text('FlatButton'),
onPressed: () {},
textColor: MaterialStateColor.resolveWith(getTextColor),
),
);
}
}