Flutter UI组件库插件kloktun_uikit的使用

Flutter UI组件库插件kloktun_uikit的使用

特性

包括用于构建界面的UI组件。例如按钮、文本字段等。

import 'package:example/tabs.dart';
import 'package:flutter/material.dart' hide ButtonThemeData;
import 'package:kloktun_uikit/common/controls.dart';
import 'package:kloktun_uikit/components/radio/radio_group.dart';
import 'package:kloktun_uikit/components/theme/theme.dart';
import 'package:kloktun_uikit/kloktun_uikit.dart';

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

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

  // 这个小部件是你的应用程序的根。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return KloktunUIProvider(
      child: KloktunUIConsumer(builder: (context, state) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: state.themeData,
          home: const MyHomePage(title: 'Home Page'),
        );
      }),
    );
  }
}

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

  // 这个小部件是你的应用主页。它是一个有状态的小部件,意味着它有一个状态对象(在下面定义)包含影响其外观的字段。
  // 这个类是状态的配置。它持有由父级(在这个例子中是App小部件)提供的值(在这个例子中是标题),并被状态的构建方法使用。小部件子类中的字段总是标记为"final"。

  final String title;

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

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

  double value = 1;
  setValue(double newValue) {
    setState(() {
      value = newValue;
    });
  }

  void _incrementCounter() {
    KloktunUIState.of(context).setTheme(KloktunTheme(
        colors: KloktunThemeColors(
            primary: Colors.white, background: Color(0xFF202020))));

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

  var loading = false;

  _toggleLoading() {
    setState(() {
      loading = !loading;
    });
  }

  List<int?> values = [null, 2];

  changeValues(List<int?> newValues) {
    setState(() {
      values = newValues;
    });
  }

  handlePopup() async {
    var globalLoader = KGlobalSpinner(context);

    globalLoader.show();

    await Future.delayed(Duration(seconds: 2));

    globalLoader.close();

    var result = await showKConfirmPopup(
        context: context,
        danger: true,
        icon: Icon(Icons.abc),
        title: Text("标题"),
        child: Text(
          "你确定吗?",
        ),
        buttonsDirection: Axis.horizontal,
        confirmButtonText: "是的,确定",
        cancelButtonText: "不确定");

    print(result);

    showKMessagePopup(
        context: context,
        // danger: true,
        title: Text("标题"),
        child: Text(
          "发生了一些事情",
        ),
        buttonsDirection: Axis.horizontal,
        okayButtonText: '明白了');
  }

  int? selectValue;
  setSelectValue(int? value) {
    setState(() {
      selectValue = value;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: KAppBar(
        title: Text(widget.title),
      ),
      body: Center(
        // Center 是一个布局小部件。它接受一个子项,并将其定位在父级的中间。
        child: Column(
          // Column 也是一个布局小部件。它接受一个子项列表,并垂直排列它们。默认情况下,它水平大小适配其子项,并尝试与父级一样高。
          //
          // Column 有许多属性来控制其自身的大小及其子项的位置。在这里我们使用mainAxisAlignment来将子项垂直居中;主轴是垂直轴,因为Columns是垂直的(交叉轴将是水平的)。
          //
          // 尝试一下:调用"调试绘制"(在IDE中选择"切换调试绘制"操作,或在控制台中按"p"),可以看到每个小部件的线框。
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            KButton(
                onPressed: () {
                  Navigator.of(context)
                      .push(MaterialPageRoute(builder: (_) => TabsPage()));
                },
                size: ControlSize.regular,
                child: const Text("选项卡")),
            KSwitch(
                value: loading,
                onChange: (newValue) {
                  setState(() {
                    loading = newValue;
                  });
                }),
            KSelect<int?>(
                icon: Icon(Icons.ac_unit_outlined),
                placeholder: "选择数字",
                value: selectValue,
                size: ControlSize.large,
                onChange: setSelectValue,
                clearable: true,
                options: const [
                  KSelectOption(
                      icon: Icon(Icons.abc),
                      value: 1,
                      child: Text("另一个子项"),
                      divider: true),
                  KSelectOption(
                    value: 2,
                    label: Text("一些数据 2"),
                  ),
                  KSelectOption(
                    value: 3,
                    label: Text("一些数据 3"),
                  )
                ]),
            KButton(child: Text("显示弹窗"), onPressed: handlePopup),
            KInput(
              placeholder: "嘿,怎么了",
            ),
            KTextarea(
              size: ControlSize.regular,
              placeholder: "嘿,怎么了",
              minLines: 1,
              maxLines: 4,
            ),
            VGap(8),
            KTextarea(
              size: ControlSize.regular,
              placeholder: "嘿,怎么了",
              minLines: 2,
              maxLines: 4,
            ),
            VGap(8),
            KInput(
              success: true,
              warning: true,
              error: true,
              obscureText: true,
              togglePassword: true,
              clearable: true,
              placeholder: "输入一些东西",

              // prepend: KButton(
              //     type: KButtonType.borderless, child: Text("做一些")),
              // prefix: Text("一些前缀"),
              prefix: KIconButton(
                child: Icon(Icons.search),
              ),
              prefixIcon: Icon(Icons.circle),
              // prefixText: "前缀文本",
              prefixPlaceholder: "vk.com/",
              // suffixPlaceholder: "后缀占位符",
              // suffixText: "后缀文本",
              // suffixIcon: Icon(Icons.abc),
              // suffix: Text("一些后缀"),
              // append: KButton(
              //   type: KButtonType.borderless,
              //   child: Text("做一些"),
              // )
            ),
            KButton(
              loading: loading,
              // disabled: true,
              type: KButtonType.plain,
              size: ControlSize.medium,
              warning: true,
              child: Text("你好"),
            ),
            KIconButton(
              loading: loading,
              // disabled: true,
              type: KIconButtonType.primaryText,
              // warning: true,
              onPressed: _toggleLoading,
              error: true,
              child: Icon(KloktunIcons.search),
            ),
            KCheckbox(
              value: loading,
              onChange: (newValue) {
                setState(() {
                  loading = newValue;
                });
              },
              child: Text("一些数据"),
            ),
            KLabel(
              label: Text("只是一个标签"),
              child: Text("一些值"),
            ),
            KDivider(),
            KHelper(
              // text: Text("只是一个助手"),
              error: Text("只是一个错误"),
              // suffix: Text("一些后缀"),
              child: Text("一些字段"),
            ),
            KDivider(),
            Padding(
              padding: EdgeInsets.all(16),
              child: KAlert(
                icon: Icon(KloktunIcons.circle),
                // title: Text("一些标题"),
                child: Text("一些子项"),
                // error: true,
                // warning: true,
                // success: true,
                // suffix: KButton(
                //   child: Text("点击我"),
                // ),
              ),
            ),
            KDivider(),
            Checkbox(
                value: loading,
                onChanged: (newValue) {
                  setState(() {
                    loading = newValue ?? false;
                  });
                }),
            KCheckboxGroup<int?>(
              options: const [
                KCheckboxGroupOption(value: null, child: Text("1")),
                KCheckboxGroupOption(value: 2, disabled: true, child: Text("2")),
                KCheckboxGroupOption(value: 3, child: Text("3")),
              ],
              values: values,
              onChange: changeValues,
            ),
            KRadioGroup(
              value: loading,
              // disabled: true,
              onChange: (value) {
                setState(() {
                  loading = value;
                });
              },
              options: const [
                KRadioGroupOption(
                  value: false,
                  disabled: true,
                  child: Text("未加载"),
                ),
                KRadioGroupOption(value: true, child: Text("加载中"))
              ],
            ),
            KButton(
              onPressed: _toggleLoading,
              size: ControlSize.regular,
              child: const Text("加载中"),
            ),
            KButton(
              onPressed: _toggleLoading,
              size: ControlSize.regular,
              type: KButtonType.primary,
              icon: Icon(Icons.circle),
              child: const Text("查找"),
            ),
            KDivider(
                // indent: 10,
                // endIndent: 20,
                // childAlign: KDividerChildAlign.center,
                // child: Text("或"),
                ),
            Container(
                padding: EdgeInsets.symmetric(
                    // horizontal: 100
                    ),
                width: double.infinity,
                child: KSlider(
                    value: value, min: 1, max: 7, step: 1, onChange: setValue)),
            VGap(100),
            Slider(
              value: value,
              min: 1,
              max: 7,
              onChanged: setValue,
            ),
            Text("值: $value"),
            const Text(
              '你已经按了这个按钮这么多次:',
            ),
            TextField(
              decoration: InputDecoration(hintText: "一些文本"),
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: '增加',
        child: const Icon(Icons.add),
      ), // 这个尾随逗号使自动格式化更美观。
    );
  }
}

更多关于Flutter UI组件库插件kloktun_uikit的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter UI组件库插件kloktun_uikit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


kloktun_uikit 是一个 Flutter 的 UI 组件库插件,它提供了一系列预构建的 UI 组件,帮助开发者快速构建美观且功能丰富的应用程序。以下是关于如何使用 kloktun_uikit 的基本指南。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 kloktun_uikit 依赖。

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

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

2. 导入库

在你的 Dart 文件中导入 kloktun_uikit 库。

import 'package:kloktun_uikit/kloktun_uikit.dart';

3. 使用组件

kloktun_uikit 提供了多种 UI 组件,你可以直接在项目中使用它们。以下是一些常见组件的示例:

按钮组件

KloktunButton(
  onPressed: () {
    // 按钮点击事件
  },
  text: 'Click Me',
  color: Colors.blue,
);

卡片组件

KloktunCard(
  child: Column(
    children: [
      Text('Card Title'),
      Text('This is a card content.'),
    ],
  ),
);

输入框组件

KloktunTextField(
  hintText: 'Enter your name',
  onChanged: (value) {
    // 输入内容变化时的回调
  },
);

加载指示器

KloktunLoadingIndicator(
  size: 50.0,
  color: Colors.blue,
);

4. 自定义主题

kloktun_uikit 允许你自定义主题,以便更好地适配你的应用程序风格。

MaterialApp(
  theme: ThemeData(
    primarySwatch: Colors.blue,
    visualDensity: VisualDensity.adaptivePlatformDensity,
  ),
  home: MyHomePage(),
);

5. 示例代码

以下是一个简单的示例,展示了如何使用 kloktun_uikit 中的一些组件。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Kloktun UI Kit Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Kloktun UI Kit Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            KloktunButton(
              onPressed: () {
                print('Button Clicked');
              },
              text: 'Click Me',
              color: Colors.blue,
            ),
            SizedBox(height: 20),
            KloktunCard(
              child: Column(
                children: [
                  Text('Card Title'),
                  Text('This is a card content.'),
                ],
              ),
            ),
            SizedBox(height: 20),
            KloktunTextField(
              hintText: 'Enter your name',
              onChanged: (value) {
                print('Input: $value');
              },
            ),
            SizedBox(height: 20),
            KloktunLoadingIndicator(
              size: 50.0,
              color: Colors.blue,
            ),
          ],
        ),
      ),
    );
  }
}
回到顶部