更新2020 - 05 - 15
这是行不通的,请参阅:
- 无法从另一个隔离调用平台通道方法·问题#13937·flutter/flutter https://github.com/flutter/flutter/issues/13937
注:完整代码见文末
第 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 步:使用静态方法调用compute并返回
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);
}
Ref:
- 在后台解析 JSON - Flutter https://flutter.dev/docs/cookbook/networking/background-parsing#4-move-this-work-to-a-separate-isolate
不重要参考:
-
Flutter async:重型起重操作的初学者友好指南 https://blog.usejournal.com/flutter-async-beginner-friendly-guide-for-heavy-lifting-operations-cf8ec81833d7?gi=c61a4a7f641d
-
Dart/Flutter:转换时间戳 - Thinbug https://stackoverflow.com/questions/50632217/dart-flutter-converting-timestamp
-
显示小吃栏 - Flutter https://flutter.dev/docs/cookbook/design/snackbars
-
sdk/file.dart 位于 1c4ad14fa3a0a1d5ecea10e3b04befecee3ffbcb · dart-lang/sdk https://github.com/dart-lang/sdk/blob/1c4ad14fa3a0a1d5ecea10e3b04befecee3ffbcb/sdk/lib/io/file.dart
-
-
sdk/file_impl.dart 位于 1c4ad14fa3a0a1d5ecea10e3b04befecee3ffbcb · dart-lang/sdk https://github.com/dart-lang/sdk/blob/1c4ad14fa3a0a1d5ecea10e3b04befecee3ffbcb/sdk/lib/io/file_impl.dart
-