You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Flutter GetX传递Model类数据至控制器并写入Firebase?

Flutter + GetX + Firestore CRUD 实现指南(结合Task模型)

前置准备

先确保你的项目已配置好依赖和Firebase初始化:

  1. 在pubspec.yaml添加依赖:
dependencies:
  flutter:
    sdk: flutter
  get: ^4.6.5
  firebase_core: ^2.15.0
  cloud_firestore: ^4.8.4
  json_annotation: ^4.8.1
dev_dependencies:
  json_serializable: ^6.7.1
  1. 在main.dart初始化Firebase:
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

1. 创建GetX控制器处理Firestore CRUD

创建TaskController,封装所有Firestore操作,同时利用GetX的可观察列表自动同步UI:

import 'package:get/get.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:your_app/models/task.dart';

class TaskController extends GetxController {
  // Firestore任务集合引用
  final CollectionReference taskCollection = FirebaseFirestore.instance.collection('tasks');

  // 可观察任务列表,自动更新UI
  final RxList<Task> taskList = <Task>[].obs;

  @override
  void onInit() {
    super.onInit();
    // 监听集合变化,自动同步列表数据
    taskList.bindStream(
      taskCollection.snapshots().map(
        (snapshot) => snapshot.docs
            .map((doc) => Task.fromMap(doc.data() as Map<String, dynamic>))
            .toList(),
      ),
    );
  }

  // 创建:添加任务到Firestore
  Future<void> addTask(Task task) async {
    try {
      await taskCollection.add(task.toMap());
      Get.snackbar('成功', '任务已添加');
    } catch (e) {
      Get.snackbar('错误', '添加失败: ${e.toString()}');
    }
  }

  // 读取:获取单个任务
  Future<Task?> getTask(String taskId) async {
    try {
      DocumentSnapshot doc = await taskCollection.doc(taskId).get();
      return doc.exists ? Task.fromMap(doc.data() as Map<String, dynamic>) : null;
    } catch (e) {
      Get.snackbar('错误', '获取失败: ${e.toString()}');
      return null;
    }
  }

  // 更新:修改任务数据
  Future<void> updateTask(String taskId, Task updatedTask) async {
    try {
      await taskCollection.doc(taskId).update(updatedTask.toMap());
      Get.snackbar('成功', '任务已更新');
    } catch (e) {
      Get.snackbar('错误', '更新失败: ${e.toString()}');
    }
  }

  // 删除:移除任务
  Future<void> deleteTask(String taskId) async {
    try {
      await taskCollection.doc(taskId).delete();
      Get.snackbar('成功', '任务已删除');
    } catch (e) {
      Get.snackbar('错误', '删除失败: ${e.toString()}');
    }
  }
}

2. 点击按钮传递Task数据到控制器并插入Firebase

假设你有一个表单页面收集任务信息,点击提交按钮时将数据传递给控制器:

class AddTaskPage extends StatelessWidget {
  // 注入TaskController
  final TaskController taskController = Get.put(TaskController());

  // 表单输入控制器
  final TextEditingController titleController = TextEditingController();
  final TextEditingController noteController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('添加任务')),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: titleController,
              decoration: const InputDecoration(labelText: '任务标题'),
            ),
            TextField(
              controller: noteController,
              decoration: const InputDecoration(labelText: '任务备注'),
            ),
            // 其他字段组件(日期选择器、时间选择器、颜色选择器等)
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 构建Task对象(实际开发中从输入组件获取真实值)
                final newTask = Task(
                  id: DateTime.now().millisecondsSinceEpoch, // 用时间戳作为唯一ID
                  title: titleController.text.trim(),
                  note: noteController.text.trim(),
                  isCompleted: 0,
                  date: '2024-05-20',
                  startTime: '09:00',
                  endTime: '10:00',
                  color: 0xff1E88E5,
                  remind: 10,
                  repeat: 'daily',
                );
                // 调用控制器方法插入Firebase
                taskController.addTask(newTask);
                // 返回任务列表页
                Get.back();
              },
              child: const Text('提交任务'),
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  • Firestore的文档ID可以通过add方法自动生成,也可以用doc('自定义ID').set()手动指定;如果用手动ID,建议保证唯一性(比如UUID或时间戳)。
  • 你的Task模型中的id字段如果要存储Firestore文档ID,建议改为String?类型,并在toMap方法中匹配字段名。

参考资源

  • GetX官方文档:重点学习状态管理、依赖注入模块
  • Firebase Flutter官方文档:Cloud Firestore基础操作章节
  • GetX GitHub仓库:可找到Firestore结合使用的官方示例代码

内容的提问来源于stack exchange,提问作者I Can Done

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:43:12