Flutter主题管理插件dart_topic_pack的使用

Flutter主题管理插件dart_topic_pack的使用

本文档将详细介绍如何使用Flutter主题管理插件dart_topic_pack。该插件允许开发者轻松管理和切换应用的主题。

功能

  • 管理应用的主题
  • 在运行时动态切换主题
  • 提供多种预设主题以供选择

代码示例

主题类定义

首先,我们需要定义一些主题。在本示例中,我们将创建两个主题:lightThemedarkTheme

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

final lightTheme = Topic(
  name: 'Light Theme',
  themeData: ThemeData(
    brightness: Brightness.light,
    primaryColor: Colors.blue,
    accentColor: Colors.red,
    scaffoldBackgroundColor: Colors.white,
  ),
);

final darkTheme = Topic(
  name: 'Dark Theme',
  themeData: ThemeData(
    brightness: Brightness.dark,
    primaryColor: Colors.black,
    accentColor: Colors.green,
    scaffoldBackgroundColor: Colors.grey[850],
  ),
);

创建主题管理器

接下来,我们需要创建一个TopicManager来管理这些主题。

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return TopicProvider(
      topics: [lightTheme, darkTheme],
      initialTopic: lightTheme,
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: Topic.of(context).themeData,
        home: MyHomePage(),
      ),
    );
  }
}

使用主题

在应用的页面中,我们可以通过Topic.of(context)获取当前主题,并根据当前主题调整UI。

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _isDarkMode = false;

  void _toggleTheme() {
    setState(() {
      _isDarkMode = !_isDarkMode;
      TopicProvider.of(context).changeTopic(_isDarkMode ? darkTheme : lightTheme);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Theme Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'This is a ${_isDarkMode ? 'Dark' : 'Light'} Theme Example',
              style: TextStyle(color: Theme.of(context).primaryColor),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _toggleTheme,
              child: Text('Toggle Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

完整示例

下面是完整的示例代码,包括所有部分:

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

// 定义主题
final lightTheme = Topic(
  name: 'Light Theme',
  themeData: ThemeData(
    brightness: Brightness.light,
    primaryColor: Colors.blue,
    accentColor: Colors.red,
    scaffoldBackgroundColor: Colors.white,
  ),
);

final darkTheme = Topic(
  name: 'Dark Theme',
  themeData: ThemeData(
    brightness: Brightness.dark,
    primaryColor: Colors.black,
    accentColor: Colors.green,
    scaffoldBackgroundColor: Colors.grey[850],
  ),
);

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return TopicProvider(
      topics: [lightTheme, darkTheme],
      initialTopic: lightTheme,
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: Topic.of(context).themeData,
        home: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _isDarkMode = false;

  void _toggleTheme() {
    setState(() {
      _isDarkMode = !_isDarkMode;
      TopicProvider.of(context).changeTopic(_isDarkMode ? darkTheme : lightTheme);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Theme Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'This is a ${_isDarkMode ? 'Dark' : 'Light'} Theme Example',
              style: TextStyle(color: Theme.of(context).primaryColor),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _toggleTheme,
              child: Text('Toggle Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


dart_topic_pack 是一个用于 Flutter 应用的主题管理插件。它允许开发者轻松地管理和切换应用的主题,支持自定义主题、动态主题切换等功能。以下是如何使用 dart_topic_pack 插件的基本步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 dart_topic_pack 的依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_topic_pack: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 创建主题

在使用 dart_topic_pack 之前,你需要定义你的应用主题。你可以创建多个主题,例如 lightThemedarkTheme

import 'package:flutter/material.dart';

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

final ThemeData darkTheme = ThemeData(
  primarySwatch: Colors.indigo,
  brightness: Brightness.dark,
);

3. 初始化主题管理

在你的应用启动时,初始化 dart_topic_pack 并设置默认主题。

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

void main() {
  // 初始化主题管理
  TopicPack.initialize(
    themes: {
      'light': lightTheme,
      'dark': darkTheme,
    },
    defaultTheme: 'light',
  );

  runApp(MyApp());
}

4. 使用主题

在应用中使用 TopicPack 来获取当前主题,并在 MaterialApp 中应用主题。

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Theme Demo',
      theme: TopicPack.currentTheme, // 使用当前主题
      home: MyHomePage(),
    );
  }
}

5. 动态切换主题

你可以在应用中的任何地方使用 TopicPack 来动态切换主题。

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Theme Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                TopicPack.setTheme('light'); // 切换到亮色主题
              },
              child: Text('Light Theme'),
            ),
            ElevatedButton(
              onPressed: () {
                TopicPack.setTheme('dark'); // 切换到暗色主题
              },
              child: Text('Dark Theme'),
            ),
          ],
        ),
      ),
    );
  }
}

6. 监听主题变化

如果你需要在主题变化时执行某些操作,你可以监听主题变化事件。

TopicPack.addListener(() {
  // 主题变化时的回调
  print('Theme changed to ${TopicPack.currentThemeName}');
});

7. 持久化主题

你可以将用户选择的主题保存到本地存储中,以便在应用重启时恢复主题。

import 'package:shared_preferences/shared_preferences.dart';

void saveTheme(String themeName) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  await prefs.setString('theme', themeName);
}

Future<String?> loadTheme() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  return prefs.getString('theme');
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  String? savedTheme = await loadTheme();
  
  TopicPack.initialize(
    themes: {
      'light': lightTheme,
      'dark': darkTheme,
    },
    defaultTheme: savedTheme ?? 'light',
  );

  runApp(MyApp());
}

8. 完整示例

以下是一个完整的示例,展示了如何使用 dart_topic_pack 管理主题:

import 'package:flutter/material.dart';
import 'package:dart_topic_pack/dart_topic_pack.dart';
import 'package:shared_preferences/shared_preferences.dart';

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

final ThemeData darkTheme = ThemeData(
  primarySwatch: Colors.indigo,
  brightness: Brightness.dark,
);

void saveTheme(String themeName) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  await prefs.setString('theme', themeName);
}

Future<String?> loadTheme() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  return prefs.getString('theme');
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  String? savedTheme = await loadTheme();
  
  TopicPack.initialize(
    themes: {
      'light': lightTheme,
      'dark': darkTheme,
    },
    defaultTheme: savedTheme ?? 'light',
  );

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Theme Demo',
      theme: TopicPack.currentTheme,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Theme Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                TopicPack.setTheme('light');
                saveTheme('light');
              },
              child: Text('Light Theme'),
            ),
            ElevatedButton(
              onPressed: () {
                TopicPack.setTheme('dark');
                saveTheme('dark');
              },
              child: Text('Dark Theme'),
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部