颤音主题:动态颜色和theeextension
#android #flutter #dart #themes

问候,开发人员!进入Flutter 3.10的迷人领域,其中主题是创建沉浸式和用户友好的应用程序的中心阶段。在此博客中,我们将踏上激动人心的旅程,以实现动态主题自定义。当我们获得对颜色无与伦比的控制时,拥抱ThemeExtension的强大功能。

让我们深入研究并将动态主题与自定义颜色扩展扩展到Flutter应用程序中!示例Github Repo您可以在这里找到


默认主题

默认情况下,Flutter提供了一个浅色和深色主题。这些主题带有针对应用程序栏,背景,文本,按钮等元素的预定义配色方案。在探索动态主题之前,让我们简要介绍一下浅色和深色模式的默认调色板。

步骤1:为应用程序创建主题。


// Theme 
class AppTheme {

static ThemeData themeData(
      {Color seedColor = Colors.green, bool isDark = false}) {
    ColorScheme colorScheme = isDark
        ? ColorScheme.fromSeed(seedColor: seedColor).copyWith(brightness: Brightness.dark)
        : ColorScheme.fromSeed(seedColor: seedColor).copyWith( brightness: Brightness.light);

    return ThemeData(colorScheme: colorScheme);
  }




}

步骤2:在您的 main.dart 文件中,使用您的浅色主题。



 // ..


class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "'Flutter Theme Example',"
      theme: AppTheme.themeData(isDark: false),
      darkTheme: AppTheme.themeData(isDark: true),
      home: MyHomePage(),
    );
  }
}


使其动态

在本节中,我们将探讨如何在Flutter应用中动态更改主题颜色。使用此用户可以个性化他们的应用程序的外观。为了实现这一目标,我们将利用Flutter的ChangeNotifier在整个应用程序中更新主题。

步骤1.我们将首先创建一个appthemeprovider类,该类扩展了ChangeNotifier类,该类都在主题更改时通知听众。


class AppThemeProvider extends ChangeNotifier {
  late Color _seedColor;
  Color get seedColor => _seedColor;

  set seedColor(value) {
    _seedColor = value;
    notifyListeners();
  }

  AppThemeProvider({required Color defaultColor}) {
    _seedColor = Color.lerp(defaultColor, Colors.black, 0.1) ?? defaultColor;
  }

  void updateTheme(Color currentColor) {
    seedColor = currentColor;
  }

}

步骤2。现在更改您的main.dart文件添加changeNotifierProvider。


void main() {
  runApp(
    ChangeNotifierProvider<AppThemeProvider>(
      create: (context) => AppThemeProvider(),
      child: MyApp(),
    ),
  );
}

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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {

    final appThemeProvider = Provider.of<AppThemeProvider>(context);
    return MaterialApp(
      title: 'Flutter Theme Example',
      theme: AppTheme.themeData(seedColor: appThemeProvider.seedColor),
      darkTheme: AppTheme.themeData(seedColor: appThemeProvider.seedColor, isDark: true),
      home: MyHomePage(),
    );
  }
}

步骤3:在您的任何页面中。


class MyHomePage extends StatelessWidget {

  // ..

  // call this for color change
  void _toggleTheme(BuildContext context, Color seedColor) {
    context.read<AppThemeProvider>().updateTheme(currentColor);
  }
}

挑选颜色,您可以使用flutter_colorpicker


使用thewexension自定义颜色

假设您需要对应用程序的调色板进行更多控制。例如,文本和背景的不同灰色。
Flutter提供了themexexensions,这是为应用程序主题添加自定义颜色的强大方法。使用theSexexensions,您可以定义诸如“表面”,“ onsurface”,“ primaly -high”等颜色。这些自定义颜色可让您对各种UI元素的外观进行颗粒状的控制,从而实现真正的个性化和凝聚力的应用程序设计。让我们这样做:

步骤1:创建一个名为app_theme_colors.dart的新飞镖文件。



@immutable
class AppThemeColors extends ThemeExtension<AppThemeColors> {
  final Color onSurfaceHigh;

  const AppThemeColors({
    required this.onSurfaceHigh,
  });

  @override
  ThemeExtension<AppThemeColors> copyWith({
    Color? onSurfaceHigh,

  }) {
    return AppThemeColors(
      onSurfaceHigh: onSurfaceHigh ?? this.onSurfaceHigh,

    );
  }

  @override
  ThemeExtension<AppThemeColors> lerp(
      ThemeExtension<AppThemeColors>? other, double t) {
    if (other is! AppThemeColors) {
      return this;
    }
    return AppThemeColors(
      onSurfaceHigh: Color.lerp(onSurfaceHigh, other.onSurfaceHigh, t) ??
          other.onSurfaceHigh,
      // isDark: true,
    );
  }

  @override
  String toString() {
    return 'AppThemeColors(seed: $onSurfaceHigh)';
  }

  factory AppThemeColors.seedColor({
    Color seedColor = Colors.red,
    bool isDark = false,
  }) {
    print("isDark: $isDark $seedColor");

    var surfaceBasedColor = isDark
        ? Color.alphaBlend(Colors.white.withOpacity(0.1), Colors.black)
        : Colors.white;

    var onSurfaceBasedColor = isDark ? Colors.white : Colors.black;

    var onSurfaceHigh = Color.alphaBlend(
        onSurfaceBasedColor.withOpacity(0.7), surfaceBasedColor);

    return AppThemeColors(onSurfaceHigh: onSurfaceHigh);
  }
}

步骤2:更新您的Main.dart以使用主题扩展。


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

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {

    final appThemeProvider = Provider.of<AppThemeProvider>(context);
    return MaterialApp(
      title: 'Flutter Theme Example',
      theme: AppTheme.themeData(seedColor: appThemeProvider.seedColor).copyWith(
          extensions: <ThemeExtension<dynamic>>[
            AppThemeColors.create(
                 isDark: false)
          ]),
      darkTheme: AppTheme.themeData(seedColor: appThemeProvider.seedColor, isDark: true).copyWith(
          extensions: <ThemeExtension<dynamic>>[
            AppThemeColors.create(
                 isDark: true)
          ]),
      home: MyHomePage(),
    );
  }
}

步骤3:更新页面以使用主题扩展



class MyPage extends StatelessWidget {
  late AppThemeColors themeColors;

  @override
  Widget build(BuildContext context) {
    themeColors = Theme.of(context).extension<AppThemeColors>() ??
        AppThemeColors.create(); // if null
    // ..

    return Scaffold(
      body: Container(
        child: Text(
          "By continuing, you agree to our",
          style: TextStyle(color: themeColors.onSurfaceHigh),
        ),
      ),
    );
  }
}

通过设置app_theme_colors.dart,您现在可以轻松地在一个地方自定义浅色和黑暗主题,使您的代码更清洁,更可维护。


结论:

恭喜!您已经完成了动态主题和theeextensions的设置。

不要忘记尝试我们的example app
Image description

在您未来的项目中释放了颤音主题和theSextensions的全部潜力。

我们已经在App Hundi:唱片书之一中实现了这一点。

Hundi: Record Book - Apps on Google Play

周期性的Hundi集团管理。日志交易并确保透明度。

favicon play.google.com