Flutter动态主题切换插件dynamic_theme_nullsafe的使用

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

Flutter动态主题切换插件dynamic_theme_nullsafe的使用

动态主题切换插件介绍

dynamic_theme_nullsafe 是一个用于在运行时动态切换Flutter应用主题的插件。它允许你轻松地改变应用的主题,并且可以保存这些主题设置。

Flutter动态主题切换插件dynamic_theme_nullsafe

这个插件可以帮助你在不增加复杂性的前提下,实现动态主题切换功能。

包含在项目中

首先,你需要在你的项目中添加dynamic_theme_nullsafe依赖项:

dependencies:
  dynamic_theme_nullsafe: ^1.0.5

然后运行packages get命令并导入它:

import 'package:dynamic_theme_nullsafe/dynamic_theme_nullsafe.dart';

使用示例

下面是一个完整的示例代码,展示了如何使用dynamic_theme_nullsafe插件来动态切换主题:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return DynamicThemeNullsafe(
      defaultThemeMode: ThemeMode.light,
      loadThemeOnStart: true,
      data: (mode) => ThemeData(
        primarySwatch: Colors.indigo,
        brightness: mode == ThemeMode.dark ? Brightness.dark : Brightness.light,
      ),
      themedWidgetBuilder: (
        BuildContext context,
        ThemeMode mode,
        ThemeData? data,
      ) {
        return MaterialApp(
          themeMode: mode,
          title: 'Flutter Demo',
          theme: data,
          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](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Easy Theme'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                DynamicThemeNullsafe.of(context).toggleThemeMode();
              },
              child: const Text('Toggle brightness'),
            ),
            const SizedBox(height: 11),
            ElevatedButton(
              onPressed: changeColor,
              child: const Text('Change color'),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: showChooser,
        child: const Icon(Icons.add),
      ),
      bottomNavigationBar: BottomNavigationBar(
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.insert_drive_file),
            label: 'Tab 1',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.show_chart),
            label: 'Tab 2',
          ),
        ],
      ),
    );
  }

  void showChooser() {
    showDialog<void>(
      context: context,
      builder: (BuildContext context) {
        return BrightnessSwitcherDialog(
          onSelectedTheme: (ThemeMode mode) {
            DynamicThemeNullsafe.of(context).setThemeMode(mode);
          },
        );
      },
    );
  }

  void changeColor() {
    DynamicThemeNullsafe.of(context).setThemeData(
      ThemeData(
        primaryColor: Theme.of(context).primaryColor == Colors.indigo
            ? Colors.red
            : Colors.indigo,
      ),
    );
  }
}

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

1 回复

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


当然,以下是关于如何在Flutter项目中使用dynamic_theme_nullsafe插件来实现动态主题切换的示例代码。dynamic_theme_nullsafe是一个允许应用程序在运行时切换主题的Flutter插件,它支持空安全。

步骤 1: 添加依赖

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

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

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

步骤 2: 设置主题数据

在你的MaterialApp中设置两个主题(例如,亮色主题和暗色主题),并使用DynamicTheme包装你的应用。

import 'package:flutter/material.dart';
import 'package:dynamic_theme_nullsafe/dynamic_theme.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final Brightness initialBrightness = MediaQuery.platformBrightnessOf(context);
    final ThemeData lightTheme = ThemeData.light();
    final ThemeData darkTheme = ThemeData.dark();

    return DynamicTheme(
      defaultBrightness: initialBrightness,
      data: (brightness) {
        return brightness == Brightness.light
            ? lightTheme
            : darkTheme;
      },
      themedWidgetBuilder: (context, theme) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: theme,
          home: MyHomePage(),
        );
      },
    );
  }
}

步骤 3: 创建切换主题的按钮

在你的主页面(例如MyHomePage)中,添加一个按钮来切换主题。

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:dynamic_theme_nullsafe/dynamic_theme.dart';

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dynamic Theme Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              'Current Theme Mode: ${Theme.of(context).brightness == Brightness.light ? 'Light' : 'Dark'}',
              style: Theme.of(context).textTheme.headline4,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                final DynamicThemeState themeState =
                    context.read<DynamicThemeState>();
                themeState.setBrightness(
                  themeState.brightness == Brightness.light
                      ? Brightness.dark
                      : Brightness.light,
                );
              },
              child: Text('Switch Theme'),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

注意:在上面的代码中,我们使用了Providercontext.read方法来访问DynamicThemeState,但是实际上dynamic_theme_nullsafe并不直接提供Provider集成。为了简单起见,这里假设你已经以某种方式集成了状态管理(比如使用Provider),或者你可以直接使用DynamicTheme.of(context).setBrightness(...),但这需要在DynamicTheme的子树中才能正确访问。

由于DynamicTheme.of(context)的使用可能会引发上下文问题,更常见的做法是通过某种状态管理方案(如ProviderGetXRiverpod等)来管理主题状态。

注意事项

  • 确保你的应用已经正确设置了Provider或其他状态管理方案(如果需要)。
  • dynamic_theme_nullsafe插件的API可能会随着版本更新而变化,请参考最新的官方文档。

希望这能帮助你实现Flutter应用的动态主题切换!

回到顶部