Flutter主题管理插件flutter_theme_provider的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter主题管理插件flutter_theme_provider的使用

一个基于provider包创建的主题切换插件。

功能特性

  • 提供了一种简单的方式来为你的Flutter应用提供主题。
  • 可以保存并应用用户上次设置的主题。
  • 允许你提供自定义的ThemeData

开始使用

只需安装该插件,即可实现动态更改主题的功能。

使用方法

通过ChangeNotifierProviderThemeProvider()类添加到MaterialApp中。

使用方式:在你的MaterialApptheme参数中使用theme.getTheme()。 不要忘记用Consumer<ThemeProvider>包装MaterialApp

示例代码

在你的MaterialApp()中:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
            create: (context) => 
                ThemeProvider(defaultThemeName: "Light", themes: [
                  {"Light": ThemeData.light()},
                  {"Dark": ThemeData.dark()}
                ])),
      ],
      child: Consumer<ThemeProvider>(
        builder: (context, theme, child) => MaterialApp(
          home: ThemeChangeScreen(),
          theme: theme.getTheme(),
        ),
      ),
    );
  }
}

在你想要提供主题切换选项的地方:

Consumer<ThemeProvider>(
  builder: (context, theme, child) => PopupMenuButton<dynamic>(
    offset: Offset(100, 0),
    child: ListTile(
      leading: const Icon(Icons.brush),
      title: const Text(
        "Theme",
        style: TextStyle(fontFamily: "Poppins"),
      ),
      subtitle: Text(
        "${theme.getThemeName()}",
        style: TextStyle(fontFamily: "Poppins"),
      ),
      trailing: Icon(Icons.edit),
    ),
    itemBuilder: (context) => theme.getThemeNames
        .map((item) => PopupMenuItem(
              value: item,
              child: Text(item),
              onTap: () => theme.setTheme(item),
            ))
        .toList(),
  ),
),

ThemeProvider() 参数说明

带有所有参数的例子

ThemeProvider(defaultThemeName: "Light", themes: [
    {"Light": ThemeData.light()},
    {"Dark": ThemeData.dark()}
])),

更多关于Flutter主题管理插件flutter_theme_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter主题管理插件flutter_theme_provider的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用Flutter主题管理插件flutter_theme_provider的代码示例。这个示例将展示如何设置和使用主题提供者来管理应用的主题。

首先,确保你已经在pubspec.yaml文件中添加了flutter_theme_provider依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_theme_provider: ^^最新版本号(请替换为实际版本号)

然后,运行flutter pub get来获取依赖。

接下来,创建一个Flutter应用,并在其中使用flutter_theme_provider

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_theme_provider/flutter_theme_provider.dart';

void main() {
  runApp(
    ThemeProvider(
      // 初始化主题数据
      initTheme: ThemeData.light(),
      child: MyApp(),
    ),
  );
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Theme Provider Demo',
      themeMode: ThemeMode.system, // 或者 ThemeMode.light / ThemeMode.dark
      theme: ThemeProvider.of(context).theme,
      darkTheme: ThemeData.dark(), // 可选,用于黑暗模式
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Theme Provider Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ThemeSwitcher(),
            SizedBox(height: 20),
            Text(
              'Hello, Flutter Theme Provider!',
              style: TextStyle(fontSize: 24),
            ),
          ],
        ),
      ),
    );
  }
}

class ThemeSwitcher extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final ThemeProvider themeProvider = ThemeProvider.of(context);

    return Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        ElevatedButton(
          onPressed: () {
            themeProvider.setThemeData(ThemeData.light());
          },
          child: Text('Light Theme'),
        ),
        SizedBox(width: 20),
        ElevatedButton(
          onPressed: () {
            themeProvider.setThemeData(ThemeData.dark());
          },
          child: Text('Dark Theme'),
        ),
      ],
    );
  }
}

解释

  1. ThemeProvider:

    • main函数中,我们使用ThemeProvider包裹了MyAppThemeProviderflutter_theme_provider包提供的一个widget,用于管理主题数据。
    • initTheme参数用于初始化主题数据,这里我们使用了ThemeData.light()作为默认主题。
  2. MyApp:

    • MyApp是一个StatelessWidget,它创建了一个MaterialApp
    • 我们通过ThemeProvider.of(context).theme获取当前主题,并将其赋值给MaterialApptheme属性。
    • themeMode设置为ThemeMode.system,这样应用会根据系统主题自动切换。你也可以设置为ThemeMode.lightThemeMode.dark来强制使用特定主题模式。
  3. HomeScreen:

    • HomeScreen包含了一个ThemeSwitcher和一个显示文本的widget。
  4. ThemeSwitcher:

    • ThemeSwitcher是一个包含两个按钮的Row,分别用于切换到亮色主题和暗色主题。
    • 使用themeProvider.setThemeData方法来设置新的主题数据。

这样,你就可以在Flutter应用中使用flutter_theme_provider来管理主题了。用户可以通过点击按钮来切换应用的主题。

回到顶部