250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- activity
- tabbar
- intent
- ScrollView
- scroll
- 안드로이드
- 앱바
- drift
- 앱
- textfield
- textview
- Button
- Dialog
- Kotlin
- Coroutines
- CustomScrollView
- viewmodel
- TEST
- LifeCycle
- binding
- DART
- data
- livedata
- 테스트
- appbar
- Navigation
- 계측
- Compose
- Flutter
- android
Archives
- Today
- Total
Study Record
[Flutter] drift 에서 Future 와 Stream 차이점 본문
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
'Flutter > 라이브러리' 카테고리의 다른 글
[Flutter] 서버와 통신하기 (dio v5.1.1) (0) | 2023.04.14 |
---|---|
[Flutter] 간단한 데이터 저장 (flutter_secure_storage) (0) | 2023.04.07 |
[Flutter] 데이터베이스 importing (drift) (0) | 2023.03.26 |
[Flutter] drift 에서 테이블 데이터 가져오기 (insert, select, delete, update etc) (0) | 2023.03.25 |
[Flutter] 데이터베이스 table 만들기 (drift) (0) | 2023.03.24 |