Flutter样式管理插件styled的使用

Flutter样式管理插件styled的使用

pub.dev License Build Status Styled in Github

特性

A declarative UI tool for flutter to simplify the creation of widgets, pass arguments in positional without order.

使用此库作为依赖项

添加依赖

运行以下命令:

$ flutter pub add styled

这将向你的包的pubspec.yaml文件添加如下行(并隐式运行flutter pub get):

dependencies:
  styled: "^0.1.0"

或者,你可以通过编辑器支持的功能来获取依赖项。查阅你的编辑器文档以了解更多信息。

导入库

在Dart代码中,现在可以这样使用:

import 'package:styled/styled.dart';

使用

  • 对于受支持的组件,添加后缀’d’到组件名称以使用简化版本。
  • 命名参数先于位置参数。

例如:

return Scaffoldd(
    AppBard(
      Theme.of(context).colorScheme.inversePrimary,
      Textd(widget.title),
    ),
    Centerd(
      Columnd(
        MainAxisAlignment.center,
        Textd('counter: $_counter'),
        Textd("TextD", 26, 12.5, FontWeight.bold, Colors.red),
        Textd("TextD2", Textd(18.5, FontWeight.w300, Colors.orange)),
        Rowd(
          MainAxisAlignment.center,
          Containerd(50, 50, const Color.fromARGB(255, 255, 0, 0)),
          Containerd(50, 50, const Color.fromARGB(255, 231, 255, 10)),
          Containerd(50, 50, const Color.fromARGB(255, 15, 221, 15)),
        ),
        Rowd(
          MainAxisAlignment.center,
          Containerd(35, 35, Colors.red, BoxShape.circle, Borderd(3, Colors.redAccent)),
          Containerd(Colors.yellow, BoxShape.circle, 35, 35, Borderd(3, Colors.yellowAccent)),
          Containerd(35, 35, Borderd(3, Colors.greenAccent), Colors.green, BoxShape.circle),
        ),
      ),
    ),
    FloatingActionButtond(
        _incrementCounter,
        'Increment',
        const Icon(Icons.add),
    ),
  );

解释版:

return Scaffoldd(
    AppBard( // `AppBar` => 'appBar' of Scaffold
      Theme.of(context).colorScheme.inversePrimary, // `Color:0` => 'backgroundColor'
      Text(widget.title), // `Widget` => 'title'
      title: Textd("named arguments precede positional ones", 20,
          const Color.fromARGB(255, 33, 211, 71)), // override 'title' with named argument
      ),
    ),
    Centerd( // `Widget` => 'body' of Scaffold
      Columnd( // `Widget` => 'child' of Center
        MainAxisAlignment.center,
        Textd('counter: $_counter'), // `Widget` will be added into the children of Column|Row.
        // The inner Textd returns a `TextStyle`, when no text:String is specified.
        Textd("TextD2", Textd(18.5, FontWeight.w300, Colors.orange)),
        <Widget>[ // type of `List<Widget>` => 'children' of the Column
          Textd(
            "TextD", // `String` => text to display
            26,   // 1st of type `int|double` => 'fontSize'
            12.5, // 2nd of type `int|double` => 'letterSpacing'
            FontWeight.bold,
            FontStyle.italic,
            // 1st of type `Color` => 'color'
            Colors.red,
            // 2nd of type `Color` => 'backgroundColor'
            const Color.fromARGB(255, 55, 101, 228),
            // 3rd of type `Color` => 'decorationColor'
            const Color.fromARGB(255, 226, 223, 33),
            // use enum:TextMaxLines to set maxlines
            TextMaxLines.three,
            // override `backgroundColor` with named argument
            backgroundColor: Colors.greenAccent,
          ),
        ],
      ),
    ),
    FloatingActionButtond( // => 'floatingActionButton' of Scaffold
        _incrementCounter,     // `void Function()` => 'onPressed' 
        'Increment',           // `String` => 'tooltip'
        const Icon(Icons.add), // `Widget` => 'child'
    ),
  );

额外信息

  • <code>Textd</code>: 返回一个Text小部件或TextStyle,如果未指定String类型的参数。
  • 在提示文档中,例如,Color: 0:color, 1:backgroundColor, 2: decorationColor, 3:selectionColor 表示第一个Color类型的参数被视为’color’,第二个被视为’backgroundColor’,第三个被视为’decorationColor’,第四个被视为’selectionColor’。
  • <code>Containerd</code> 混合装饰参数。

例如:

  Containerd(
    45, // width
    45, // height
    BoxDecorationd(
      Colors.blue,
      Borderd(Colors.black, 3),
      BoxShadowd(Colors.grey.withOpacity(0.5), 7, 5, const Offset(0, 3)),
      BorderRadius.circular(0.5),
      borderRadius: BorderRadius.circular(10.5), // named arg precedes positional one
    ),
  ),

使用装饰混合:

  Containerd(
    45, // width
    45, // height
    Colors.blue,
    Borderd(Colors.black, 3),
    BoxShadowd(Colors.grey.withOpacity(0.5), 7, 5, const Offset(0, 3)),
    BorderRadius.circular(0.5),
    borderRadius: BorderRadius.circular(10.5), // named arg precedes positional one
  ),

支持的小部件

<table><tbody><tr>
<td>
<ul>
<li> AboutDialogd
</li><li> AbsorbPointerd
</li><li> ActionChipd
</li><li> Actionsd
</li><li> AlertDialogAdaptived
</li><li> AlertDialogd
</li><li> Alignd
</li><li> AnimatedAlignd
</li><li> AnimatedBuilder
</li><li> AnimatedContainerd
</li><li> AnimatedCrossFaded
</li><li> AnimatedIcond
</li><li> AnimatedListd
</li><li> AnimatedOpacityd
</li><li> AnimatedPaddingd
</li><li> AnimatedPositionedd
</li><li> AnimatedSwitcherd
</li><li> AppBard (partial)
</li><li> AspectRatiod
</li><li> Autocomplete
</li><li> BackdropFilterd
</li><li> Badged
</li><li> Baselined
</li><li> BottomAppBard
</li><li> BottomNavigationBarItemd
</li><li> BottomNavigationBard
</li><li> Builderd
</li><li> CallbackShortcutsd
</li><li> Cardd
</li><li> Centerd
</li><li> CheckboxListTiled (partial)
</li><li> CheckedPopupMenuItemd
</li><li> Chipd
</li><li> ChoiceChipd
</li><li> CircleAvatard
</li><li> CircularProgressIndicatord
</li><li> ClipOvald
</li><li> ClipPathd
</li><li> ClipRRectd
</li><li> ClipRectd
</li><li> ColorFilteredd
</li><li> Columnd
</li><li> ConstrainedBoxd
</li><li> Containerd
</li><li> CustomMultiChildLayoutd
</li><li> CustomPaintd
</li><li> CustomScrollViewd
</li><li> CustomSingleChildLayoutd
</li><li> DataTabled (partial)
</li><li> DecoratedBoxTransitiond
</li><li> DecoratedSliverd
</li><li> DefaultTabControllerd
</li><li> DefaultTextStyled
</li><li> Dismissibled
</li><li> Dividerd
</li><li> DragTarget
</li><li> Draggable (partial)
</li><li> DraggableScrollableSheetd
</li><li> Drawerd
</li><li> ElevatedButtond
</li><li> ExcludeSemanticsd
</li><li> Expandedd
</li><li> ExpansionPanelListd
</li></ul>
</td><td>
<ul>
<li> ExpansionPaneld
</li><li> FilledButtonTonalIcond
</li><li> FilledButtond
</li><li> FilterChipd
</li><li> FittedBoxd
</li><li> Flexd
</li><li> Flexibled
</li><li> Flipd as Transform.flip
</li><li> FloatingActionButtonExtendedd
</li><li> FloatingActionButtond
</li><li> Flowd
</li><li> FocusableActionDetectord
</li><li> Focusd
</li><li> FormField
</li><li> Formd
</li><li> FractionalTranslationd
</li><li> FractionallySizedBoxd
</li><li> GridTiled
</li><li> GridViewBuilderd
</li><li> GridViewCountd
</li><li> GridViewCustomd
</li><li> GridViewExtentd
</li><li> GridViewd
</li><li> HeroModed
</li><li> Herod
</li><li> IconButtond
</li><li> IgnorePointerd
</li><li> ImageAssetd
</li><li> ImageFiled
</li><li> ImageMemoryd
</li><li> ImageNetworkd
</li><li> Imaged
</li><li> IndexedStackd
</li><li> InkResponsed
</li><li> InkWelld
</li><li> Inkd
</li><li> InputChipd
</li><li> InteractiveViewerd
</li><li> IntrinsicHeightd
</li><li> IntrinsicWidthd
</li><li> LimitedBoxd
</li><li> LinearProgressIndicatord
</li><li> ListBodyd
</li><li> ListTiled (partial)
</li><li> ListViewBuilderd
</li><li> ListViewCustomd
</li><li> ListViewSeparatedd
</li><li> ListViewd (partial)
</li><li> ListWheelScrollViewd
</li><li> MergeSemanticsd
</li><li> MouseRegiond
</li><li> NavigationBard
</li><li> NavigationDestinationd
</li><li> NavigationDrawerd
</li><li> NavigationRailDestinationd
</li><li> NavigationRaild
</li><li> NestedScrollViewd
</li><li> NotificationListenerd
</li><li> Offstaged
</li><li> Opacityd
</li><li> OutlinedButtonIcond
</li><li> OutlinedButtond
</li><li> OverflowBoxd
</li></ul>
</td><td>
<ul>
<li> Paddingd
</li><li> PageViewd (partial)
</li><li> PhysicalModeld
</li><li> Placeholderd
</li><li> PopScoped
</li><li> PopupMenuDividerd
</li><li> PopupMenuItemd
</li><li> Positionedd
</li><li> RadioListTiled
</li><li> Radiod
</li><li> RangeSliderd
</li><li> RawImaged
</li><li> RawKeyboardListenerd
</li><li> RawMagnifierd
</li><li> RawMaterialButtond
</li><li> RefreshIndicatord
</li><li> RepaintBoundaryd
</li><li> RichTextd
</li><li> Rotated as Transform.rotate
</li><li> RotatedBoxd
</li><li> Rowd
</li><li> SafeAread
</li><li> Scaffoldd (partial)
</li><li> Scaled as Transform.scale
</li><li> ScrollConfigurationd
</li><li> Scrollabled
</li><li> Scrollbard
</li><li> SegmentedButtond
</li><li> Semanticsd (partial)
</li><li> ShaderMaskd
</li><li> Shortcutsd
</li><li> SingleChildScrollViewd
</li><li> SizedBoxd
</li><li> SizedOverflowBoxd
</li><li> SliderAdaptived as Slider.adaptive
</li><li> Sliderd
</li><li> SliverAppBard (partial)
</li><li> SliverOffstaged
</li><li> SliverOverlapAbsorberd
</li><li> SliverOverlapInjectord
</li><li> SliverPaddingd
</li><li> SnackBard
</li><li> Spacerd
</li><li> Stackd
</li><li> SwitchListTiled
</li><li> Switchd
</li><li> TabBarViewd
</li><li> TabBard
</li><li> TabPageSelectord
</li><li> Tabd
</li><li> TableRowd
</li><li> Tabled
</li><li> TextButtonIcond
</li><li> TextButtond
</li><li> Textd
</li><li> TickerMode
</li><li> ToggleButtonsd
</li><li> ToolTipd
</li><li> Translated as Transform.translate
</li><li> UnconstrainedBoxd
</li><li> VerticalDividerd
</li><li> Visibilityd
</li><li> Wrapd
</li></ul>
</td>
</tr></tbody></table>

已知不支持的组件

<ul>
<li> ButtonStyle
</li><li> Cupertino widgets
</li><li> DropdownButton
</li><li> FutureBuilder
</li><li> GestureDetector
</li><li> ImageFilter.matrix
</li><li> LayoutBuilder
</li><li> LongPressDraggable
</li><li> PopupMenuButton
</li><li> Positioned.*
</li><li> ReorderableListView
</li><li> ReorderableListView.builder
</li><li> SelectableText
</li><li> SelectableText.rich
</li><li> StreamBuilder
</li><li> TableBorder
</li><li> TextField
</li><li> TextFormField
</li><li> TweenAnimationBuilder
</li><li> ValueListenableBuilder 
</li></ul>

更改日志

请参阅 Changelog 页面。

许可证

Styled 以MIT许可证分发。更多详情请参阅 LICENSE

完整示例代码

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

import 'widgets/segment_button.dart';
import 'widgets/checkbox_example.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Styled Demo',
      darkTheme: ThemeData.dark(useMaterial3: true),
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  int currentPageIndex = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  static List<Tab> myTabs = [
    Tabd('LEFT', const Icon(Icons.join_left)),
    Tabd('STRAIGHT', const Icon(Icons.straight)),
    Tabd('RIGHT', const Icon(Icons.join_right)),
  ];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: myTabs.length,
      child: Scaffoldd(
        AppBard(
          Theme.of(context).colorScheme.inversePrimary, // backgroundColor
          Text(widget.title), // title
          title: Textd("named arguments precede positional ones", 20,
              const Color.fromARGB(255, 33, 211, 71)),
          TabBard(myTabs),
        ),
        TabBarViewd(
          Rowd(
            MainAxisAlignment.center,
            Centerd(
              Columnd(
                MainAxisAlignment.center,
                Textd(
                  'counter: $_counter',
                  backgroundColor: Colors.amberAccent,
                  style: Theme.of(context).textTheme.headlineMedium,
                ),
                Textd("text TextStyle", Theme.of(context).textTheme.bodyLarge),
                Textd("Styled TextD",
                    Textd(18.5, FontWeight.w300, Colors.orange)),
                Textd("Styled TextD2", 18.5, backgroundColor: Colors.amber),
                Textd(
                  "TextD", // text
                  26, // 1st of type `int|double` which is 'fontSize'
                  12.5, // 2nd of type `int|double` which is 'letterSpacing'
                  FontWeight.bold,
                  FontStyle.italic,
                  // 1st of type `Color`, which is 'color'
                  Colors.red,
                  // 2nd of type `Color`, which is 'backgroundColor'
                  const Color.fromARGB(255, 55, 101, 228),
                  // 3rd of type `Color`, which is 'decorationColor'
                  const Color.fromARGB(255, 226, 223, 33),
                  // use enum:TextMaxLines to set maxlines
                  TextMaxLines.three,
                  // override `backgroundColor` with named argument
                  backgroundColor: Colors.greenAccent,
                ),
                Rowd(
                  MainAxisAlignment.center,
                  Containerd(35, 35, const Color.fromARGB(255, 255, 0, 0)),
                  Containerd(35, 35, const Color.fromARGB(255, 231, 255, 10)),
                  Containerd(35, 35, const Color.fromARGB(255, 15, 221, 15)),
                ),
                Rowd(
                  MainAxisAlignment.center,
                  Containerd(35, 35, Colors.red, BoxShape.circle,
                      Borderd(3, Colors.redAccent)),
                  Containerd(Colors.yellow, BoxShape.circle, 35, 35,
                      Borderd(3, Colors.yellowAccent)),
                  Containerd(35, 35, Borderd(3, Colors.greenAccent),
                      Colors.green, BoxShape.circle),
                ),
                Containerd(
                  Paddingd(
                    const EdgeInsets.all(5.5),
                    Textd('This is a fancy container!', Colors.blue),
                  ),
                  LinearGradientd(Colors.red, Colors.orange, Colors.yellow),
                  BorderRadius.circular(20.0),
                  BoxShadowd(
                    Colors.black.withOpacity(0.5),
                    10,
                    const Offset(0.0, 5.0),
                  ),
                ),
                Containerd(
                  45,
                  45,
                  Colors.blue,
                  Borderd(Colors.black, 3),
                  BorderRadius.circular(0.5),
                  BoxShadowd(
                    Colors.grey.withOpacity(0.5),
                    7,
                    5,
                    const Offset(0, 3),
                  ),
                  borderRadius:
                      BorderRadius.circular(10.5), // named arg precedes
                  // named decoration precedes
                  decoration: BoxDecorationd(
                    LinearGradientd(
                      Colors.red,
                      Colors.orange,
                      Colors.yellow,
                      Alignment.topLeft,
                      Alignment.bottomRight,
                    ),
                    BorderRadius.circular(20.0),
                    BoxShadowd(
                      Colors.black.withOpacity(0.5),
                      10,
                      const Offset(10.0, 10.0),
                    ),
                  ),
                ),
                RichTextd(
                  TextSpand(
                    'This\n',
                    Textd(25, Colors.red, FontWeight.bold),
                    TextSpand('is link\n',
                        Textd(20, Colors.blue, TextDecoration.underline)),
                    TextSpand(
                        'text.\n', Textd(Colors.yellow, FontStyle.italic)),
                    TextSpand('bold\n', Textd(Colors.purple, FontWeight.bold)),
                  ),
                ), // RichTextd
              ),
            ), // Centerd
            Columnd(
              MainAxisAlignment.center,
              Stackd(
                Containerd(80, 80, Colors.blue),
                Containerd(60, 60, Colors.yellow),
                Containerd(50, 50, Colors.red),
              ),
              Stackd(
                Alignment.center,
                Containerd(80, 80, Colors.blue, BoxShape.circle),
                Containerd(60, 60, Colors.yellow, BoxShape.circle),
                LimitedBoxd(
                    30, 30, Containerd(50, 50, Colors.red, BoxShape.circle)),
              ),
              Stackd(
                Containerd(50, 50, color: Colors.white),
                Containerd(
                  const EdgeInsets.all(5.0),
                  Alignment.bottomCenter,
                  LinearGradientd(
                    Alignment.topCenter,
                    Alignment.bottomCenter,
                    Colors.black.withAlpha(0),
                    Colors.black12,
                    Colors.black45,
                  ),
                  Textd('Foreground', Colors.white, 20),
                ),
              ),
              ElevatedButtond(
                Textd("Button", 16, Colors.blue), // `child`
                () {}, // `onPressed`
              ),
              // BackdropFilterd(
              //   ImageBlurd(5, 6), //ImageFilter.blur(sigmaX: 5, sigmaY: 6),
              ElevatedButtond(
                const Icon(Icons.ac_unit_rounded), // `icon`
                Textd("label", 16), // `label`
                () {}, // `onPressed`
              ),
              // ),
              Scaled(
                0.8,
                1.2,
                IconButtond(
                  26.5, // `iconSize`
                  8.5, // `splashRadius`
                  const Icon(Icons.point_of_sale_rounded),
                  "tooltip", // `tooltip`
                  () {}, // `onPressed`
                  Colors.green,
                  Colors.greenAccent,
                ),
              ),
            ), // Column
          ), // Rowd
          Columnd(
            // tab 2
            MainAxisAlignment.center,
            const Spacer(),
            const Text('Single choice'),
            const SingleChoice(),
            const SizedBox(height: 20),
            const Text('Multiple choice'),
            const MultipleChoice(),
            const Spacer(),
            Expandedd(const CheckboxExample()),
          ), // Column
          Columnd(
            // tab 3
            MainAxisAlignment.center,
            const Spacer(),
            const Text('Single choice'),
            const SingleChoice(),
            const SizedBox(height: 20),
            const Text('Multiple choice'),
            const MultipleChoice(),
            const Spacer(),
          ), // Column
        ),
        // NavigationBard(
        //   (int index) {
        //     setState(() {
        //       currentPageIndex = index;
        //     });
        //   },
        //   indicatorColor: Colors.amber[800],
        //   currentPageIndex,
        //   NavigationDestinationd(
        //     'Home',
        //     const Icon(Icons.home_outlined),
        //     const Icon(Icons.home),
        //   ),
        //   NavigationDestinationd(
        //     const Icon(Icons.business),
        //     'Business',
        //   ),
        //   NavigationDestinationd(
        //     const Icon(Icons.school_outlined),
        //     const Icon(Icons.school),
        //     'School',
        //   ),
        // ),
        FloatingActionButtond(
          _incrementCounter, // `void Function()` => 'onPressed'
          'Increment', // `String` => 'tooltip'
          const Icon(Icons.add), // `Widget` => 'child'
        ),
      ),
    );
  }
}

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

1 回复

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


styled 是一个用于 Flutter 的样式管理插件,它可以帮助你更简洁、更高效地管理和应用样式。它的设计灵感来源于 CSS-in-JS 库(如 styled-components),允许你在 Dart 代码中直接定义和应用样式。

安装

首先,你需要在 pubspec.yaml 文件中添加 styled 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  styled: ^2.0.0

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

基本用法

styled 插件的核心思想是通过 Styled 类来创建样式化的组件。你可以像使用普通的 Flutter 组件一样使用这些样式化的组件。

1. 创建一个样式化的组件

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Styled Example'),
        ),
        body: Center(
          child: Styled.text('Hello, Styled!')
              .textColor(Colors.blue)
              .fontSize(24)
              .bold()
              .padding(all: 16)
              .borderRadius(all: 8)
              .backgroundColor(Colors.lightBlue[100])
              .elevation(2),
        ),
      ),
    );
  }
}

在上面这个例子中,我们创建了一个样式化的文本组件,并应用了多种样式属性,如文本颜色、字体大小、加粗、内边距、圆角、背景颜色和阴影。

2. 复用样式

你还可以将样式定义为一个变量,以便在多个地方复用:

final headlineStyle = Styled.text('')
    .textColor(Colors.blue)
    .fontSize(24)
    .bold()
    .padding(all: 16)
    .borderRadius(all: 8)
    .backgroundColor(Colors.lightBlue[100])
    .elevation(2);

// 使用样式
headlineStyle.child('Hello, Styled!');

3. 条件样式

styled 插件还支持条件样式,你可以根据不同的条件应用不同的样式:

Styled.text('Hello, Styled!')
    .textColor(isActive ? Colors.blue : Colors.grey)
    .fontSize(24)
    .bold();

4. 样式继承

你可以通过 copyWith 方法继承并修改现有的样式:

final baseStyle = Styled.text('')
    .textColor(Colors.blue)
    .fontSize(24);

final modifiedStyle = baseStyle.copyWith(
    textColor: Colors.red,
    fontSize: 30,
);

5. 自定义组件

你还可以将样式应用到自定义组件上:

Styled.custom(
  child: MyCustomWidget(),
)
.padding(all: 16)
.borderRadius(all: 8)
.backgroundColor(Colors.lightBlue[100]);
回到顶部