不確定這是一個錯誤還是事情如何運作,或者我做錯了什么。
我正在制作一個應用程式,它可以決議一些資料的文本檔案,然后將其存盤在 sqlite 資料庫中。在某些時候,我決定添加基本的微調器來指示正在進行決議,因為它通常需要幾秒鐘的平均時間。
所以我增加了一個三元運算子這使得CircularProgressIndicator()如果isBusy變數設定為true。我的決議時間突然增加到原來的 10 倍左右。那是在 Linux 上。在 Android 上,它也會減慢行程,但僅會增加約 70%。我檢查了一些東西,看起來任何影片都會導致這個問題,例如AnimatedContainer.
重現步驟:
- 運行下面的代碼,注意對話框中的完成時間。
- 取消注釋
CircularProgressIndicator()或AnimatedContainer阻止并再次運行代碼。注意現在需要多長時間。
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: darkBlue,
),
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: MyWidget(),
),
),
);
}
}
class MyWidget extends StatefulWidget {
@override
State<MyWidget> createState() => _MyWidget();
}
class _MyWidget extends State<MyWidget> {
var _width = 50.0;
var _height = 50.0;
void startHeavyOperation() async {
final directory = await getApplicationDocumentsDirectory();
var myFile = File('${directory.path}/test.txt');
const max = 10000;
var x = 0;
setState(() {
_width = 300;
_height = 300;
});
final startTime = DateTime.now();
while (x < max) {
await myFile.writeAsString('$x\n', mode: FileMode.append);
x = 1;
}
final endTime = DateTime.now();
final durationInMilliseconds = endTime.difference(startTime).inMilliseconds;
showDialog(
context: context,
builder: (ctx) => AlertDialog(
title: Text('It took $durationInMilliseconds ms'),
),
);
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () => startHeavyOperation(),
child: const Text('startHeavyOperation'),
),
// AnimatedContainer(
// duration: Duration(seconds: 10),
// child: Text('123'),
// color: Colors.red,
// width: _width,
// height: _height,
// ),
// CircularProgressIndicator(),
],
),
);
}
}
我的問題是:有沒有辦法在不減慢磁盤寫入的情況下使用影片?
uj5u.com熱心網友回復:
是的 - 我懷疑它確實是影片。嘗試將繁重的操作放在隔離中 - 我懷疑這會加快速度(在設備上)。 這是一個例子。
uj5u.com熱心網友回復:
即使沒有影片,while 陳述句也非常昂貴。放置一個單獨的隔離會為您節省一些時間。這是對您的代碼示例的快速修改。compute會給你一個未來。
void startHeavyOperation(String path) async {
var myFile = File('$path/test.txt');
const max = 10000;
var x = 0;
final startTime = DateTime.now();
while (x < max) {
await myFile.writeAsString('$x\n', mode: FileMode.append);
x = 1;
}
final endTime = DateTime.now();
final durationInMilliseconds = endTime.difference(startTime).inMilliseconds;
print('It took $durationInMilliseconds ms');
}
class MyWidget extends StatefulWidget {
@override
State<MyWidget> createState() => _MyWidget();
}
class _MyWidget extends State<MyWidget> {
var _width = 50.0;
var _height = 50.0;
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
final directory = await getApplicationDocumentsDirectory();
compute(startHeavyOperation, directory.path);
},
child: const Text('startHeavyOperation'),
),
// AnimatedContainer(
// duration: Duration(seconds: 10),
// child: Text('123'),
// color: Colors.red,
// width: _width,
// height: _height,
// ),
//
CircularProgressIndicator(),
],
),
);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/315035.html
