Flutter主题管理插件im_themed的使用

Flutter主题管理插件im_themed的使用

功能

im_themed 插件允许在运行时更改 ThemeData

特性

  • 支持基本的 ThemeData 解析和编码为 JSON

开始使用

安装

在终端中运行以下命令来添加插件:

flutter pub add im_themed

或者在 pubspec.yaml 文件中添加依赖项:

dependencies:
  im_themed: <last_version>

使用示例

完整的示例代码可以在 这里 查看。

示例代码

void main() async {
  runApp(
    const ImThemedApp(
      app: MainPage(),
    ),
  );
}

主页面代码

import 'dart:convert';

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

ThemeData initialTheme = ThemeData(
  primarySwatch: Colors.blue,
  brightness: Brightness.light,
);

void main() async {
  runApp(
    const ImThemedApp(
      app: MainPage(),
    ),
  );
}

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

  [@override](/user/override)
  State<MainPage> createState() => _MainPageState();
}

class _MainPageState extends State<MainPage> {
  final JsonEncoder encoder = const JsonEncoder.withIndent('  ');
  late final textController = TextEditingController(
    text: encoder.convert(context.theme.toJson()),
  );

  [@override](/user/override)
  Widget build(BuildContext context) {
    return ImThemedApp(
      initialTheme: initialTheme,
      app: Builder(
        builder: (context) {
          return MaterialApp(
            theme: context.theme,
            debugShowCheckedModeBanner: false,
            home: Scaffold(
              appBar: AppBar(
                backgroundColor: Theme.of(context).colorScheme.primary,
                title: Text(
                  '实时主题编辑器',
                  style: Theme.of(context).textTheme.headlineMedium?.copyWith(
                            color: Theme.of(context).colorScheme.onPrimary,
                          ) ??
                      TextStyle(color: Theme.of(context).colorScheme.onPrimary),
                ),
              ),
              body: SafeArea(
                top: false,
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.stretch,
                  children: [
                    Expanded(
                      child: TextField(
                        controller: textController,
                        decoration: const InputDecoration(
                          contentPadding: EdgeInsets.all(20.0),
                        ),
                        expands: true,
                        minLines: null,
                        maxLines: null,
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: ElevatedButton(
                        onPressed: updateAppTheme,
                        child: const Padding(
                          padding: EdgeInsets.all(10.0),
                          child: Text('应用主题'),
                        ),
                      ),
                    ),
                  ],
                ),
              ),
            ),
          );
        }
      ),
    );
  }

  void updateAppTheme() {
    try {
      final themeData = ThemeDataJsonConverterExtension.fromJson(
        jsonDecode(textController.text),
      );
      setState(() {
        initialTheme = themeData;
      });
    } catch (error) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text(error.toString()),
        ),
      );
    }
  }
}

在这个示例中,我们创建了一个简单的应用程序,其中包含一个文本框和一个按钮。用户可以输入主题数据的 JSON 表示形式,并通过点击“应用主题”按钮将其应用到当前主题。

关键代码解释

  1. 初始化主题

    ThemeData initialTheme = ThemeData(
      primarySwatch: Colors.blue,
      brightness: Brightness.light,
    );
    

    这里定义了初始主题。

  2. 构建方法

    [@override](/user/override)
    Widget build(BuildContext context) {
      return ImThemedApp(
        initialTheme: initialTheme,
        app: Builder(
          builder: (context) {
            return MaterialApp(
              theme: context.theme,
              debugShowCheckedModeBanner: false,
              home: Scaffold(
                appBar: AppBar(
                  backgroundColor: Theme.of(context).colorScheme.primary,
                  title: Text(
                    '实时主题编辑器',
                    style: Theme.of(context).textTheme.headlineMedium?.copyWith(
                              color: Theme.of(context).colorScheme.onPrimary,
                            ) ??
                        TextStyle(color: Theme.of(context).colorScheme.onPrimary),
                  ),
                ),
                body: SafeArea(
                  top: false,
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.stretch,
                    children: [
                      Expanded(
                        child: TextField(
                          controller: textController,
                          decoration: const InputDecoration(
                            contentPadding: EdgeInsets.all(20.0),
                          ),
                          expands: true,
                          minLines: null,
                          maxLines: null,
                        ),
                      ),
                      Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: ElevatedButton(
                          onPressed: updateAppTheme,
                          child: const Padding(
                            padding: EdgeInsets.all(10.0),
                            child: Text('应用主题'),
                          ),
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            );
          }
        ),
      );
    }
    

    构建方法中,我们使用 ImThemedApp 来包裹我们的 MaterialApp,并将初始主题传递给它。文本框用于输入 JSON 格式的主题数据,按钮用于更新主题。

  3. 更新主题

    void updateAppTheme() {
      try {
        final themeData = ThemeDataJsonConverterExtension.fromJson(
          jsonDecode(textController.text),
        );
        setState(() {
          initialTheme = themeData;
        });
      } catch (error) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text(error.toString()),
          ),
        );
      }
    }
    

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

1 回复

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


当然,以下是如何在Flutter应用中使用im_themed插件进行主题管理的代码示例。im_themed是一个用于主题管理的Flutter插件,它允许你轻松地切换和管理应用的主题。假设你已经将im_themed插件添加到了你的pubspec.yaml文件中。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  im_themed: ^最新版本号  # 请替换为实际的最新版本号

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

2. 创建主题数据

在你的应用中定义两种或多种主题,例如明亮主题和黑暗主题。

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

final ThemeData lightTheme = ThemeData(
  brightness: Brightness.light,
  primarySwatch: Colors.blue,
  scaffoldBackgroundColor: Colors.white,
  textTheme: TextTheme(
    bodyText1: TextStyle(color: Colors.black),
  ),
);

final ThemeData darkTheme = ThemeData(
  brightness: Brightness.dark,
  primarySwatch: Colors.blueGrey,
  scaffoldBackgroundColor: Colors.black,
  textTheme: TextTheme(
    bodyText1: TextStyle(color: Colors.white),
  ),
);

3. 使用ImThemed包装应用

使用ImThemed包装你的MaterialApp,并设置初始主题和主题提供者。

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

void main() {
  runApp(ImThemed(
    initialTheme: lightTheme, // 设置初始主题
    themes: {
      'light': lightTheme,
      'dark': darkTheme,
    },
    builder: (context, theme) {
      return MaterialApp(
        title: 'Flutter Demo',
        theme: theme,
        home: MyHomePage(),
      );
    },
  ));
}

4. 在应用中切换主题

你可以通过按钮或其他UI元素来切换主题。以下是一个简单的例子,展示如何在主页中添加一个按钮来切换主题。

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String currentThemeKey = 'light';

  void switchTheme() {
    setState(() {
      currentThemeKey = currentThemeKey == 'light' ? 'dark' : 'light';
      ImThemed.of(context).setTheme(currentThemeKey);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Theme Switcher'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Current Theme: ${currentThemeKey == 'light' ? 'Light' : 'Dark'}',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: switchTheme,
              child: Text('Switch Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

5. 运行应用

现在你可以运行你的Flutter应用,你应该能够看到初始设置的主题,并且可以通过点击按钮来切换主题。

这个示例展示了如何使用im_themed插件来管理Flutter应用中的主题。你可以根据需要进一步自定义和扩展这些代码。

回到顶部