Flutter实战:项目开发过程

写完这整个项目,Flutter算是会了吧,但感觉啥也没学会,基本所有的问题和内容,都是通过GPT的帮助完成的,用不着脑子,根本用不着🐶。

Flutter的组件特性、如何使用就不做过多说明了,简单展示下通过直接询问GPT,得到几个例如路由、本地数据存储等关键点的代码,AI使用好了可以快速的让人在某些没接触过的内容上到达一定的水准,但不一定对,得思考和质疑。

路由:

鉴于功能简单,仅有一个页面跳转场景,也就是首页跳转编辑页。回到列表页面时候更新展示数据

Dart 复制代码
Navigator.push(context, MaterialPageRoute(builder: (context) {
  return DetailsPage(defaultCardInfo: value,);
})).then((_) => {
  // 在这里获取新的数据并更新状态
});

再增加路由返回之前拦截,做原始数据的改动检测;

Dart 复制代码
WillPopScope(onWillPop: _onWillPop, child:)

本地持久化:

GPT给出了SharedPreferences、SQLite、文件存储等不少方案。

虽然功能简单,需要的数据结构也不复杂,键 - 值对的本地存储结构也能满足,出于如果要转成多平台、设备数据同步,就少不了使用服务器了(当然印象中IOS可以使用iCloud的api做到数据同步,后续探索),出于这个考虑选择了SQLite。

DB的操作GPT给出代码基本可用。

这里节选部分代码,在DB版本升级,需要新增字段的时候给得不太清晰,但自己稍微试试也能得到结果。

Dart 复制代码
class DatabaseHelper {
  static final DatabaseHelper _instance = DatabaseHelper.internal();
  factory DatabaseHelper() => _instance;
  DatabaseHelper.internal();
  static Database? _db;
  Future<Database> get db async {
    _db ??= await initDb();
    return _db!;
  }
  initDb() async {
    var databasesPath = await getDatabasesPath();
    String path = join(databasesPath, 'card_type_db.db');
    var db = await openDatabase(path, version: 2, onCreate: _onCreate, onUpgrade: _onUpgrade);
    return db;
  }
  void _onCreate(Database db, int newVersion) async {
    await db.execute('''
      CREATE TABLE CardType (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT,
        contentList TEXT,
        created_at INTEGER,
        updated_at INTEGER,
        favorite INTEGER DEFAULT 0
      )
    '''); // 结尾逗号不能要
  }
  void _onUpgrade(Database db, int oldVersion, int newVersion) async {
    // 如果旧版本小于2,那么添加favorite字段
    if (oldVersion < 2) {
      await db.execute('ALTER TABLE CardType ADD COLUMN favorite INTEGER DEFAULT 0');
    }
  }

  // ...
}

颜色:

Flutter的颜色管理方式很系统(印象中使用antd做web后台管理系统时候处理过,但是有没有这么系统不太确认),所以单独作为一个功能项来讲述,后续可以调研在web开发中可以怎么参照。

Flutter中可以非常简单的只设定一个主题色,直接影响整个系统的各种颜色,代码如下。

Dart 复制代码
 @override
  Widget build(BuildContext context) {
    final ColorScheme colorScheme = ColorScheme.fromSeed(
      seedColor: Colors.deepPurple,
      // background: backgroundColor,
    );

    return MaterialApp(
      theme: ThemeData(
        colorScheme: colorScheme,
        useMaterial3: true,
        // scaffoldBackgroundColor: backgroundColor,
      ),
      home: const MyHomePage(),
    );
  }
Dart 复制代码
color: Theme.of(context).colorScheme.surfaceVariant,

理论上Web也有类似的。

大部分公司有设计师的情况下,颜色体系(使用Material3或者其它)都由设计师标定,再通过全局统一的css文件给出名称。但是在个人开发或者企业定制化的后台管理系统开发等场景下,这个颜色方案无比的适合。

无障碍功能:

不知道有多少APP会主动考虑这些无障碍功能,我也是在Google Play发布前测试报告提示的时候才想起,可能发布很多平台,都不会有这样的提示。不管发布什么平台,虽然可能这部分群体较少,但是我还是希望更多人在做APP的时候,能兼顾到常规之外的群体。

Flutter 里面使用Semantics 组件包裹,可以为内容提供标签。

Dart 复制代码
Semantics(
  button: true,
  label: '保存修改',
  child: const Icon(Icons.check),
),

(但是尝试给Scaffold 的 Appbar添加title,包裹到Semantics 组件,页面也依旧没有内容标签,有待后续研究。或者有大佬能给解答下,先行谢过)

相关推荐
梦想的颜色5 小时前
【编程实战】AI 时代 APP 开发全栈硬核指南:技术选型 + AI 架构 + 模型落地全维度决策
python·flutter·react native·react.js·ai·桌面应用·milvus
拆房老料5 小时前
ONLYOFFICE也能像Microsoft Word和WPS一样分别设置中西文字体
前端·html·word·开源软件·wps
Solis程序员5 小时前
Stripe 幂等表:把「不确定的重试」变成「查表返回」
前端·安全·bootstrap·php·agent
李纲明5 小时前
WordPress 站点变慢:按 TTFB → 缓存 → 查询 → 前端 分层排查(含配置注意)
前端·缓存·性能优化·wordpress·后端开发
程序人生8886 小时前
PDF 转 Word 版式错乱、表格丢失?DocConverter Web 格式互转引擎的保真实践
前端·人工智能·opencv·机器学习·pdf·word
粥里有勺糖7 小时前
安利一下最近用的桌面“Agent” | T3 Code
前端·github·ai编程
xy34537 小时前
Axure 9.0 动态面板基本操作
前端·ui·html·axure·原型·产品设计
不停喝水7 小时前
【前端转全栈java速通课】 项目实战④7-11节 操作数据库-登录-注册-修改密码-注销-mubatis-plus简化crud-
java·前端·数据库
一水鉴天8 小时前
统一对象拓扑(UOT)设计全链定稿:从三件事分离到三继承 之1 20261010(豆包“查看聊天内容”继续)
前端·css
栖凤8 小时前
Java 的 try-catch 在 Agent 里失效了,我用了 5 个模式才兜住
java·前端·python