我想要一个在ElevatedButtonOutlinedButton之间变化的按钮.我剪下了这段代码:

class Home extends StatefulWidget {
  const Home({super.key});

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  var _highlighted = false;

  void _onPressed() {
    setState(() {
      _highlighted = !_highlighted;
    });
  }

  @override
  Widget build(BuildContext context) {
    const buttonContent = Text('Button');
    return Scaffold(
      body: Center(
        child: _highlighted
            ? ElevatedButton(
                onPressed: _onPressed,
                child: buttonContent,
              )
            : OutlinedButton(
                onPressed: _onPressed,
                child: buttonContent,
              ),
      ),
    );
  }
}

下面是它看起来的样子:

enter image description here

我希望过渡是"平稳的".当按钮从一种样式更改为另一种样式时,它希望将其设置为动画.如何做到这一点?

推荐答案

我设法用AnimatedTheme得到了想要的效果.

查看以下代码片段中的小部件AnimatedButton:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      themeMode: ThemeMode.dark,
      darkTheme: ThemeData(
        brightness: Brightness.dark,
        outlinedButtonTheme: OutlinedButtonThemeData(
          style: OutlinedButton.styleFrom(
            foregroundColor: Colors.white,
            side: const BorderSide(color: Colors.white),
            padding: const EdgeInsets.all(8),
          ),
        ),
        elevatedButtonTheme: ElevatedButtonThemeData(
          style: ElevatedButton.styleFrom(
            foregroundColor: Colors.black,
            backgroundColor: Colors.white,
            padding: const EdgeInsets.all(32),
          ),
        ),
      ),
      home: const Home(),
    );
  }
}

class Home extends StatefulWidget {
  const Home({super.key});

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  var _highlighted = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: AnimatedButton(
          highlighted: _highlighted,
          onPressed: () {
            setState(() {
              _highlighted = !_highlighted;
            });
          },
          child: const Text('Button'),
        ),
      ),
    );
  }
}

class AnimatedButton extends StatelessWidget {
  const AnimatedButton({
    required this.child,
    required this.highlighted,
    required this.onPressed,
    super.key,
  });

  final Widget child;
  final bool highlighted;
  final VoidCallback onPressed;

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    return AnimatedTheme(
      data: theme.copyWith(
        outlinedButtonTheme: OutlinedButtonThemeData(
          style: highlighted
              ? theme.elevatedButtonTheme.style
              : theme.outlinedButtonTheme.style,
        ),
      ),
      child: OutlinedButton(
        onPressed: onPressed,
        child: child,
      ),
    );
  }
}

结果是(启用了"慢速动画"):

enter image description here

Flutter相关问答推荐

flutter:如何将字体大小设置得更大(更大)

如何将图像从顶部和底部半向外设置为飘动

Riverpod生成器和生成util类

如何在Firebase项目中更改包名称和包ID

将Riverpods NotifierProvider与State类一起使用

Flutter 数独网格

如何在Flutter 安全存储器中存储对象值?

构建方法中的性能声明小部件

StateNotifer正在riverpod中提供初始状态值(bool)

无法在 Flutter 项目中安装最新版本的 image_picker

课程中的访问Provider

不使用 GlobalKey 仍然收到 GlobalKey 被多次使用的错误

Flutter 判断 Uint8List 是否有效 Image

Flutter:如何从运行时创建的列表中访问单个子部件的值

小部件堆栈未显示顶层

Flutter 动保存新的变量值

如何获取 android 和 Ios (flutter) 的 CircularProgress 指示器?

在flutter web中重新加载页面时保留一些状态数据的有效方法是什么?

Flutter ListView builder 未使用新数据更新

在右侧从 a 到 z Flutter 字母列表