Flutter主题构建插件material_theme_builder的使用

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

Flutter主题构建插件material_theme_builder的使用

简介

Material Theme Builder for Flutter 是一个简单的 Flutter 接口,用于 Material Theme Builder。您可以在线查看原始构建器:https://material-foundation.github.io/material-theme-builder/

特性

  • 使用单个颜色创建调音色板
  • 使用 3 到 5 种颜色(主色、次色、第三色、错误色、中性色)创建 ColorScheme

开始使用

步骤 1:添加包到您的 pubspec.yaml

在您的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  material_theme_builder: ^x.y.z

然后运行以下命令安装包:

flutter pub get

步骤 2:使用该包

下面是一个简单的示例,展示了如何在 Flutter 应用程序中使用 material_theme_builder

示例代码

// 导入必要的库
import 'package:flutter/material.dart';
import 'package:material_theme_builder/material_theme_builder.dart';

// 定义应用的主类
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // 设置应用的主题
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: MaterialThemeBuilder(
          primary: Colors.blue,
          secondary: Colors.purple,
          tertiary: Colors.lightBlue
        ).toScheme()
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

// 定义主页的类
class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

// 主页的状态管理类
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    // 返回页面的布局
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: MaterialThemeBuilder.tonalPalette(Color(0xff80BC95))
            .entries.map((e) =>
              Container(
                height: 60,
                width: 200,
                color: e.value,
                child: Center(
                  child: Text(
                    e.key.toString(),
                    style: TextStyle(
                      color: e.key < 60 ? Colors.white : Colors.black,
                      fontSize: 18,
                      fontWeight: FontWeight.w700
                    )
                  )
                )
              )
            )
            .toList()
        )
      )
    );
  }
}

解释

  1. 导入库

    import 'package:flutter/material.dart';
    import 'package:material_theme_builder/material_theme_builder.dart';
    
  2. 定义应用的主类

    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            colorScheme: MaterialThemeBuilder(
              primary: Colors.blue,
              secondary: Colors.purple,
              tertiary: Colors.lightBlue
            ).toScheme()
          ),
          home: const MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    

    这里我们定义了一个 MaterialApp,并设置了 ThemeDatacolorScheme 使用 MaterialThemeBuilder 创建的颜色方案。

  3. 定义主页的类

    class MyHomePage extends StatefulWidget {
      const MyHomePage({Key? key, required this.title}) : super(key: key);
      final String title;
      @override
      State<MyHomePage> createState() => _MyHomePageState();
    }
    
  4. 主页的状态管理类

    class _MyHomePageState extends State<MyHomePage> {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: MaterialThemeBuilder.tonalPalette(Color(0xff80BC95))
                .entries.map((e) =>
                  Container(
                    height: 60,
                    width: 200,
                    color: e.value,
                    child: Center(
                      child: Text(
                        e.key.toString(),
                        style: TextStyle(
                          color: e.key < 60 ? Colors.white : Colors.black,
                          fontSize: 18,
                          fontWeight: FontWeight.w700
                        )
                      )
                    )
                  )
                )
                .toList()
            )
          )
        );
      }
    }
    

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

1 回复

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


当然,以下是一个关于如何使用 material_theme_builder 插件来构建 Flutter 应用的主题的代码示例。material_theme_builder 插件允许你通过 JSON 文件或者代码来动态地构建和切换应用的主题。

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

dependencies:
  flutter:
    sdk: flutter
  material_theme_builder: ^x.y.z  # 请替换为最新版本号

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

接下来是一个简单的示例,展示如何使用 material_theme_builder 来构建和切换主题。

  1. 创建一个主题配置文件(可选,但推荐):

你可以创建一个 JSON 文件来定义你的主题,例如 themes.json

{
  "themes": [
    {
      "name": "Light Theme",
      "data": {
        "brightness": "light",
        "primaryColor": "#6200ea",
        "accentColor": "#03dac5",
        "scaffoldBackgroundColor": "#ffffff",
        // 更多颜色和其他主题属性...
      }
    },
    {
      "name": "Dark Theme",
      "data": {
        "brightness": "dark",
        "primaryColor": "#bb86fc",
        "accentColor": "#1976d2",
        "scaffoldBackgroundColor": "#121212",
        // 更多颜色和其他主题属性...
      }
    }
  ]
}
  1. 加载和解析 JSON 文件(如果你使用 JSON 文件):
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:material_theme_builder/material_theme_builder.dart';
import 'dart:async' show Completer;

Future<List<MTBTheme>> loadThemesFromJson() async {
  final Completer<String> completer = Completer<String>();
  rootBundle.loadString('assets/themes.json').then((String value) => completer.complete(value));
  String jsonData = await completer.future;
  final List themesData = jsonDecode(jsonData)['themes'];

  List<MTBTheme> themes = themesData.map((theme) {
    return MTBTheme.fromJson(theme);
  }).toList();

  return themes;
}
  1. 在应用中使用 MaterialThemeBuilder
import 'package:flutter/material.dart';
import 'package:material_theme_builder/material_theme_builder.dart';
import 'your_theme_loading_file.dart'; // 假设你上面的代码保存在这个文件里

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late List<MTBTheme> themes;
  late MTBTheme currentTheme;

  @override
  void initState() {
    super.initState();
    loadThemesFromJson().then((loadedThemes) {
      setState(() {
        themes = loadedThemes;
        currentTheme = themes.first; // 默认使用第一个主题
      });
    });
  }

  void switchTheme(MTBTheme theme) {
    setState(() {
      currentTheme = theme;
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: currentTheme.toThemeData(), // 使用当前主题
      home: Scaffold(
        appBar: AppBar(
          title: Text('Theme Switcher'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              for (var theme in themes)
                ElevatedButton(
                  child: Text(theme.name),
                  onPressed: () => switchTheme(theme),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何加载 JSON 文件中的主题,并在 Flutter 应用中使用 MaterialThemeBuilder 来动态切换主题。你可以根据需求调整 JSON 文件中的主题数据以及主题切换的逻辑。

回到顶部