Study Record

[Flutter] drift 에서 Future 와 Stream 차이점 본문

Flutter/라이브러리

[Flutter] drift 에서 Future 와 Stream 차이점

초코초코초코 2023. 3. 26. 15:04
728x90

✍ Future 와 Stream

drift 에서 select 로 데이터를 가져올 때 get() 함수로 가져오는 것과 watch() 함수로 가져올 수 있다. get() 함수는 Future 로 받고 watch() 함수는 Stream 으로 받는다. Stream 으로 가져오는 것은 데이터의 변화가 있으면 자동으로 업데이트해 준다는 점이다. 반면에 Future 는 딱 한 번 실행할 때 가져오고 데이터의 변화가 있어도 업데이트하지 않는다.

import 'package:drift/drift.dart';
import 'dart:io';
import 'package:drift/native.dart';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
part 'test_database.g.dart';

@DriftDatabase(tables: [Students, Clubs])
class TestDatabase extends _$TestDatabase {
  TestDatabase() : super(_openConnection());

  @override
  int get schemaVersion => 1;

  Future<int> addStudent(StudentsCompanion entry) {
    return into(students).insert(entry);
  }

  Future<List<Student>> getStudent() {
    return (select(students))
        .get();
  }

  Stream<List<Student>> watchStudent() {
    return select(students).watch();
  }

}

 

 

예시 😶 ) Future 의 경우

데이터 베이스 테이블에 데이터를 넣어도 자동으로 업데이트하지 않는다.

 

import 'dart:math';

import 'package:drift/drift.dart' show Value;
import 'package:drift_test/database/test_database.dart';
import 'package:flutter/material.dart';

void main() async {
  // runApp 이 실행하면 자동으로 실행되지만 플러터 프로그램이 준비가 됐는지 확인
  WidgetsFlutterBinding.ensureInitialized();

  final database = TestDatabase();

  runApp(MaterialApp(
    home: MyPageWidget(database: database),
  ));
}

class MyPageWidget extends StatefulWidget {
  final TestDatabase database;
  const MyPageWidget({
    Key? key,
    required this.database,
  }) : super(key: key);

  @override
  State<MyPageWidget> createState() => _MyPageWidgetState();
}

class _MyPageWidgetState extends State<MyPageWidget> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          children: [
            ElevatedButton(
              onPressed: () {
                widget.database.addStudent(StudentsCompanion(
                  name: Value("name${Random().nextInt(100)}"),
                  grade: Value(2),
                  clubName: Value("Soccer"),
                ));
              },
              child: Text("Students 데이터 넣기"),
            ),
            Expanded(
              child: FutureBuilder<List<Student>>(
                future: widget.database.getStudent(),
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    final studentList = snapshot.data!;

                    return ListView.builder(
                      itemCount: studentList.length,
                      itemBuilder: (context, index) {
                        return Center(
                          child: Text(
                              "${studentList[index].id} : ${studentList[index].name}"),
                        );
                      },
                    );
                  }
                  return Center(child: CircularProgressIndicator());
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

 

 

예시 😶 ) Stream 의 경우

데이터 베이스 테이블에 데이터를 넣어도 자동으로 업데이트한다.

 

import 'dart:math';

import 'package:drift/drift.dart' show Value;
import 'package:drift_test/database/test_database.dart';
import 'package:flutter/material.dart';

void main() async {
  // runApp 이 실행하면 자동으로 실행되지만 플러터 프로그램이 준비가 됐는지 확인
  WidgetsFlutterBinding.ensureInitialized();

  final database = TestDatabase();

  runApp(MaterialApp(
    home: MyPageWidget(database: database),
  ));
}

class MyPageWidget extends StatefulWidget {
  final TestDatabase database;
  const MyPageWidget({
    Key? key,
    required this.database,
  }) : super(key: key);

  @override
  State<MyPageWidget> createState() => _MyPageWidgetState();
}

class _MyPageWidgetState extends State<MyPageWidget> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          children: [
            ElevatedButton(
              onPressed: () {
                widget.database.addStudent(StudentsCompanion(
                  name: Value("name${Random().nextInt(100)}"),
                  grade: Value(2),
                  clubName: Value("Soccer"),
                ));
              },
              child: Text("Students 데이터 넣기"),
            ),
            Expanded(
              child: StreamBuilder<List<Student>>(
                stream: widget.database.watchStudent(),
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    final studentList = snapshot.data!;

                    return ListView.builder(
                      itemCount: studentList.length,
                      itemBuilder: (context, index) {
                        return Center(
                          child: Text(
                              "${studentList[index].id} : ${studentList[index].name}"),
                        );
                      },
                    );
                  }
                  return Center(child: CircularProgressIndicator());
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

 

 

 

728x90