Flutter功能未定义插件f_kit的潜在用途探索

Flutter功能未定义插件f_kit的潜在用途探索

f_kit

flutter开发工具包

功能

db

FDb

基于sqflite的简单封装

  • 初始化
  • 批量执行
  • 基于sql语句的增删改查

utils

FTime

时间的工具类

  • 时间转换:

    • x年x月x日 ts2chinese
    • yyyy-MM-dd ts2line
    • yyyy/MM/dd ts2italic
  • 时间比较:

    • n天前,n小时前,刚刚 getDiff
    • 相差的天数 getDaysBetween
    • 是否是同一天 isSameDay
FkToast

toast

  • 两种方式:
    • 无需context,但是样式无法自己定制,只有少数参数可以修改
    • 需要context,可以自己定制样式
FRandom

产生随机数的工具类

  • uuid方式
  • 标准随机数方式
FShare

分享的工具类

  • 手机原生分享 share

widget

FText

基于baseFontSize预置4种字体大小的Text组件

  • 可以配置:
    • 字体尺寸 baseFontSize
    • 是否可换行 baseSoftWrap
FBtn

图片文字按钮

  • 可以配置:
    • 按钮图片背景 baseBtnImg
    • 按钮文字样式 baseTs
    • 按钮颜色背景 baseBgColor
FBtnIcon

图标按钮

  • 不传onTap即为无需点击的图标
FDialogTip

固定样式的提示弹窗

FDialogConfirm

固定样式的确认弹窗

FDialogMenu

基于按钮位置的弹出框

  • 使用前需要定义 final GlobalKey k = GlobalKey();
  • 然后给定位的按钮传入k,以及showMenu时传入k
  • 弹出的位置是在定位按钮的左下角开始
  • 修改参数offsetHeight可以调整弹出位置的高度
FLoading

固定样式的按钮处的弹出框

  • 两种使用方式:
    • 弹窗方式:会产生一个更高层的dialog堆栈,但是获得dialog特性,比如返回键可以取消,同理取消loading需要pop
    • 直接使用方式:相比弹窗,不会对页面的堆栈产生影响,纯粹是widget层次的改变,但是取消需要setState

完整示例代码

import 'package:f_kit/db/f_db.dart';
import 'package:f_kit/f_kit.dart';
import 'package:f_kit/utils/f_share.dart';
import 'package:f_kit/utils/f_time.dart';
import 'package:f_kit/widget/f_text.dart';
import 'package:f_kit/widget/f_btn.dart';
import 'package:f_kit/widget/f_dialog_tip.dart';
import 'package:f_kit/widget/f_loading.dart';
import 'package:f_kit/widget/f_dialog_confirm.dart';
import 'package:f_kit/widget/f_dialog_menu.dart';
import 'package:f_kit/utils/fk_toast.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  void aa() {
    FKit();
    print("--${FTime.ts2line(DateTime.now().millisecondsSinceEpoch)}");
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    aa();
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: NewWidget(),
      ),
    );
  }
}

class NewWidget extends StatefulWidget {
  const NewWidget({
    super.key,
  });

  [@override](/user/override)
  State<NewWidget> createState() => _NewWidgetState();
}

class _NewWidgetState extends State<NewWidget> {
  bool isLoading = false;

  [@override](/user/override)
  Widget build(BuildContext context) {
    final GlobalKey k = GlobalKey();
    return FLoading(
      isLoading: isLoading,
      child: Column(
        children: [
          Text('Running'),
          TextButton(
              onPressed: () {
                FShare.share(context, "text");
              },
              child: Text('c1')),
          FText.base("content"),
          FText.base_2("content"),
          FText.base_4("content"),
          FText.base_6("content"),
          FBtn("data", onTap: () {
            FDialogTip.show(context, "content");
          }),
          FBtn("confirm", onTap: () {
            FDialogConfirm.show(context, "content");
          }),
          FBtn(key: k, "menu", onTap: () {
            FDialogMenu.showMenu(
                context,
                k,
                const SizedBox(
                  width: 50,
                  height: 100,
                  child: Text("data"),
                ));
          }),
          FBtn("loading1", onTap: () {
            setState(() {
              isLoading = true;
            });
          }),
          FBtn("loading2", onTap: () {
            FLoading.show(context);
          }),
          FBtn("toast1", onTap: () {
            FkToast.show("msg");
          }),
          FBtn("toast2", onTap: () {
            FkToast.showCustomToast(context, Text("data"));
          }),
          FBtn("test", onTap: () async {
            int a = 0;
            a = await getaaa().catchError((e) {
              print('test: $e');
              return 11;
            }).whenComplete(() {
              print('test: complete $a');
            }).timeout(const Duration(seconds: 10), onTimeout: () {
              print('test: timeout');
              return 10;
            });
            print(a);
          }),
          FBtn("db", onTap: () {
            FDb().rawDelete('DELETE FROM Test WHERE name = ?', ['zhang']).then(
                (value) {
              if (value == -1) {
                print('rawDelete error');
              }
              print('rawDelete $value');
            });
            FDb().rawInsert(
                'INSERT INTO Test(name, value, num) VALUES(?, ?, ?)',
                ['zhang', 12345678, 3.1416]).then((value) {
              if (value == -1) {
                print('rawInsert error');
              }
              print('rawInsert $value');
            });
            FDb().rawUpdate(
                'UPDATE Test SET name = ?, value = ? WHERE name = ?',
                ['song', '9876', 'zhang']).then((value) {
              if (value == -1) {
                print('rawUpdate error');
              }
              print('rawUpdate $value');
            });
            FDb().rawQuery('SELECT * FROM Test WHERE name = ?', ['zhang']).then(
                (value) {
              print('rawQuery $value');
            });
          }),
        ],
      ),
    );
  }

  Future<int> getaaa() async {
    await Future.delayed(const Duration(seconds: 15), () {
      // 延迟
    });
    // throw Exception();
    return 1;
  }

  Future<int> getbbb() async {
    await Future.delayed(const Duration(seconds: 15), () {
      // 延迟
    });
    return 2;
  }
}

更多关于Flutter功能未定义插件f_kit的潜在用途探索的实战教程也可以访问 https://www.itying.com/category-92-b0.html

回到顶部