Flutter拟物风格设计插件flutter_neumorphic的使用

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

Flutter拟物风格设计插件flutter_neumorphic的使用

简介

flutter_neumorphic 是一个完整的拟物UI套件,适用于Flutter。通过此插件,开发者可以轻松创建具有拟物风格的界面。

在线试用

您可以在线试用 flutter_neumorphic,请点击以下链接: 👉 https://flutter-neumorphic.firebaseapp.com/ 🌐

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  flutter_neumorphic: ^3.0.3

确保您的 Flutter 版本大于 1.13.18。

然后,在您的 .dart 文件中导入该库:

import 'package:flutter_neumorphic/flutter_neumorphic.dart';

小部件

以下是 flutter_neumorphic 中的一些常用小部件及其功能:

预览 小部件 描述
Neumorphic 主要的拟物容器,根据光源和深度添加白色/黑色渐变
NeumorphicButton 拟物按钮,响应用户交互时改变深度
NeumorphicRadio 一组拟物按钮,每次只能选择一个,根据值和组值进行选择
NeumorphicCheckbox 与值关联的按钮,可选中或取消选中,如果选中则采用强调色
NeumorphicText 拟物文本(仅支持正深度)
NeumorphicIcon 拟物图标(仅支持正深度)
material.TextField 对于文本字段,只需将现有的 material.TextField 小部件包裹在 Neumorphic 容器中
NeumorphicSwitch 开关按钮,与值关联,如果打开,则采用强调色
NeumorphicToggle 多值开关,与选定的索引关联
NeumorphicSlider 拟物滑块,用户可以在范围内选择一个值
NeumorphicProgress 确定进度条,显示百分比
NeumorphicProgressIndeterminate 不确定进度条
NeumorphicBackground 采用主题背景色,可以使用 borderRadius 剪裁屏幕
NeumorphicApp 使用拟物设计的应用程序,处理主题、导航、本地化等
NeumorphicAppBar 使用拟物设计的应用栏,可用于 Scaffold

展示

基本用法

Neumorphic 容器

Neumorphic(
  style: NeumorphicStyle(
    shape: NeumorphicShape.concave,
    boxShape: NeumorphicBoxShape.roundRect(BorderRadius.circular(12)), 
    depth: 8,
    lightSource: LightSource.topLeft,
    color: Colors.grey
  ),
  child: Container(
    height: 100,
    width: 100,
    color: Colors.white,
  ),
)

Neumorphic 文本

NeumorphicText(
  "I love flutter",
  style: NeumorphicStyle(
    depth: 4,  // 自定义深度
    color: Colors.white, // 自定义颜色
  ),
  textStyle: NeumorphicTextStyle(
    fontSize: 18, // 自定义大小
    // 其他常规文本样式属性(fontFamily, fontWeight, ...)
  ),
)

Neumorphic 图标

NeumorphicIcon(
  Icons.add_circle,
  size: 80,
)

如何显示 SVG 图标?

只需使用 https://fluttericon.com/ 导出 SVG 并将其作为字体文件导出,然后使用 NeumorphicIcon(YOUR_ICON)

自定义形状

class MyShapePathProvider extends NeumorphicPathProvider {
  [@override](/user/override)
  bool shouldReclip(NeumorphicPathProvider oldClipper) {
    return true;
  }

  [@override](/user/override)
  Path getPath(Size size) {
    return Path()
      ..moveTo(0, 0)
      ..lineTo(size.width/2, 0)
      ..lineTo(size.width, size.height/2)
      ..lineTo(size.width/2, size.height/2)
      ..lineTo(size.width, size.height)
      ..lineTo(0, size.height)
      ..close();
  }
}

使用 NeumorphicBoxShape.path

Neumorphic(
  style: NeumorphicStyle(
    boxShape: NeumorphicBoxShape.path(MyShapePathProvider()),
  ),
  ...
)

可访问性 / 边框

Neumorphic(
  style: NeumorphicStyle(
    border: NeumorphicBorder(
      color: Color(0x33000000),
      width: 0.8,
    )
  ),
  ...
)

可以通过启用或禁用 isEnabled 来控制边框:

border: NeumorphicBorder(
  isEnabled: true,
  color: Color(0x33000000),
  width: 0.8,
)

拟物主题

NeumorphicTheme(
  themeMode: ThemeMode.light, // 或 dark / system
  darkTheme: NeumorphicThemeData(
    baseColor: Color(0xff333333),
    accentColor: Colors.green,
    lightSource: LightSource.topLeft,
    depth: 4,
    intensity: 0.3,
  ),
  theme: NeumorphicThemeData(
    baseColor: Color(0xffDDDDDD),
    accentColor: Colors.cyan,
    lightSource: LightSource.topLeft,
    depth: 6,
    intensity: 0.5,
  ),
  child: ...
)

获取当前使用的主题:

final theme = NeumorphicTheme.currentTheme(context);
final baseColor = theme.baseColor;
final accentColor = theme.accentColor;
...

切换到暗模式:

NeumorphicTheme.of(context).themeMode = ThemeMode.dark;

检查是否使用了暗模式:

if(NeumorphicTheme.of(context).isUsingDark){
  
}

NeumorphicApp

可以直接在项目中使用 NeumorphicApp,它直接处理拟物主题和导航。

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return NeumorphicApp(
      debugShowCheckedModeBanner: false,
      title: 'Neumorphic App',
      themeMode: ThemeMode.light,
      theme: NeumorphicThemeData(
        baseColor: Color(0xFFFFFFFF),
        lightSource: LightSource.topLeft,
        depth: 10,
      ),
      darkTheme: NeumorphicThemeData(
        baseColor: Color(0xFF3E3E3E),
        lightSource: LightSource.topLeft,
        depth: 6,
      ),
      home: MyHomePage(),
    );
  }
}

更多关于Flutter拟物风格设计插件flutter_neumorphic的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter拟物风格设计插件flutter_neumorphic的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_neumorphic插件来创建拟物风格设计的代码案例。flutter_neumorphic插件提供了一种简单的方法来创建具有深度和质感的用户界面元素。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_neumorphic: ^3.0.3  # 请检查最新版本号并更新

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

接下来,你可以在你的Dart代码中开始使用flutter_neumorphic提供的组件。以下是一个简单的示例,展示如何使用NeuCardNeuButton等组件来创建一个拟物风格的界面:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Neumorphic Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: NeumorphicDemo(),
    );
  }
}

class NeumorphicDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Neumorphic Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            NeuCard(
              margin: NeumorphicEdgeInsets.all(16),
              curveType: CurveType.convex,
              decoration: NeumorphicDecoration(
                color: Colors.white,
                depth: 10,
                borderRadius: BorderRadius.circular(20),
              ),
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text(
                      'NeuCard Example',
                      style: TextStyle(fontSize: 24),
                    ),
                    SizedBox(height: 16),
                    NeuButton(
                      onPressed: () {},
                      margin: NeumorphicEdgeInsets.symmetric(horizontal: 16),
                      decoration: NeumorphicDecoration(
                        color: Colors.blue,
                        borderRadius: BorderRadius.circular(10),
                      ),
                      child: Text(
                        'NeuButton',
                        style: TextStyle(color: Colors.white, fontSize: 18),
                      ),
                    ),
                  ],
                ),
              ),
            ),
            SizedBox(height: 32),
            NeuToggle(
              value: false,
              onChanged: (value) {},
              decoration: NeumorphicDecoration(
                color: Colors.grey[300]!,
                borderRadius: BorderRadius.circular(20),
              ),
              thumbDecoration: NeumorphicDecoration(
                color: Colors.blue,
                borderRadius: BorderRadius.circular(10),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们展示了以下几个组件:

  1. NeuCard:一个具有拟物风格的卡片组件。我们设置了margincurveTypedecoration属性来自定义卡片的外观。
  2. NeuButton:一个具有拟物风格的按钮组件。我们设置了onPressed回调、margindecoration属性来自定义按钮的外观和行为。
  3. NeuToggle:一个拟物风格的开关组件。我们设置了valueonChanged回调以及decorationthumbDecoration属性来自定义开关的外观和行为。

这些组件只是flutter_neumorphic插件提供的一部分。你可以根据需要探索更多组件和属性,以创建更复杂和美观的用户界面。

回到顶部