更新 2020 - 05 - 15
这行不通,请参阅:
注意:最后提供完整代码
第1步:使您的方法静态并使其无效
static batchInsertEventSong(List<EventSong> rows) {
Database db = await instance.database;
db.transaction((txn) async {
Batch batch = txn.batch();
for (var song in rows) {
Map<String, dynamic> row = {
DatabaseHelper.columnIdSong: song.id,
DatabaseHelper.columnTitle: song.title,
DatabaseHelper.columnInterpreter: song.interpreter
};
batch.insert(table, row);
}
batch.commit();
}
}
第 2 步:创建新方法(通常但不需要为同名添加 Async)
Future batchInsertEventSongAsync(List<EventSong> rows) {
}
第 3 步:使用您的静态方法调用计算并返回
return compute(batchInsertEventSong, rows);
步骤 [1,2,3] 代码审查
Future batchInsertEventSongAsync(List<EventSong> rows) {
return compute(_batchInsertEventSong, rows);
}
static _batchInsertEventSong(List<EventSong> rows) {
Database db = await instance.database;
db.transaction((txn) async {
Batch batch = txn.batch();
for (var song in rows) {
Map<String, dynamic> row = {
DatabaseHelper.columnIdSong: song.id,
DatabaseHelper.columnTitle: song.title,
DatabaseHelper.columnInterpreter: song.interpreter
};
batch.insert(table, row);
}
batch.commit();
}
}
完整代码
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(body: MyHomePage(title: 'Flutter Demo Home Page')),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
FlatButton.icon(
icon: Icon(Icons.backup),
label: Text("Long Opreation"),
onPressed: () async {
var rows = await RsetApi.getRawsAsync();
await Database._saveRaws(rows);
},
),
FlatButton.icon(
icon: Icon(Icons.backup),
label: Text("Short Opreation"),
onPressed: () {
Scaffold.of(context).hideCurrentSnackBar();
Scaffold.of(context).showSnackBar(new SnackBar(
content: new Text(DateTime.now().toIso8601String()),
));
},
),
],
),
),
);
}
}
class RsetApi {
static Future<List<EventSong>> getRawsAsync() {
return compute(_getRaws, null);
}
static List<EventSong> _getRaws(pram1) {
var rows = List<EventSong>();
for (var i = 1; i < 12000; i++) {
rows.add(EventSong(i));
print("fetching raws " + (i / 12000).toString());
}
return rows;
}
}
class Database {
static Future saveRawsAsync(List<EventSong> rows) {
return compute(_saveRaws, rows);
}
static _saveRaws(List<EventSong> rows) {
for (var i = 1; i < rows.length; i++) {
print("saving raws " + (i / rows.length).toString());
}
}
}
class EventSong {
int id;
EventSong(this.id);
}
参考:
非重要参考: