我做了以下簡單的類來允許輸入字串:
import 'package:flutter/material.dart';
class MyDialog {
late TextEditingController _controller;
Future<String> showMyDialog(BuildContext context) async {
_controller = TextEditingController();
final result = await showDialog(
context: context,
builder: (BuildContext context) => _buildMyDialog(context),
);
_controller.dispose();
return result;
}
Widget _buildMyDialog(BuildContext context) {
return AlertDialog(
title: const Text('Enter string: '),
content: TextField(
autofocus: true,
controller: _controller,
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop(_controller.text);
},
child: const Text('OK'),
),
],
);
}
}
我這樣稱呼它:
final dialog = MyDialog();
final result = await dialog.showMyDialog(context);
不幸的是,我收到以下錯誤:
處置后使用了 TextEditingController。
為什么會發生以及如何解決?畢竟,在處理完控制器后,我不會在任何地方使用控制器。
uj5u.com熱心網友回復:
我對 Yeasin 的回答(在撰寫本文時)的擔憂是您沒有呼叫dispose()控制器,而且我不能 100% 確定在這方面取消實體會做什么。它可能會避免錯誤,但可能存在記憶體泄漏或其他問題(假設)。
我可以建議的另一種方法是將您的AlertDialog變成 aStatefulWidget以便您可以利用 Widgets 的內置dispose()方法。這將允許您避免對控制器進行微觀管理。相反,您在包含控制器的 Widget 的 dispose 方法中呼叫控制器的 dispose 方法。
以下是您的代碼利用 Flutter 的這一特性時的樣子,它不會改變您呼叫代碼以調出對話框的方式:
class MyDialog {
Future<String> showMyDialog(BuildContext context) async {
final result = await showDialog(
context: context,
builder: (BuildContext context) => MyAlertDialog(),
);
return result;
}
}
class MyAlertDialog extends StatefulWidget {
@override
MyAlertDialog createState() => MyAlertDialogState();
}
class MyAlertDialogState extends State<MyAlertDialog> {
// for this example, it's safe to instantiate the controller inline
TextEditingController _controller = new TextEditingController();
@override
void dispose() {
// attempt to dispose controller when Widget is disposed
try { _controller.dispose(); } catch (e) {}
}
Widget build(BuildContext context) {
return AlertDialog(
title: const Text('Enter string: '),
content: TextField(
autofocus: true,
controller: _controller,
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop(_controller.text);
},
child: const Text('OK'),
),
],
);
}
}
uj5u.com熱心網友回復:
關于showMyDialog它TextEditingController每次都在更新,我們可以發表評論_controller.dispose();。此外,此方法可能會為 null,因此最好使用
Future<String?> showMyDialog(...){...}
我們可以做的另一件事是讓它可以為空
class MyDialog {
TextEditingController? _controller;
Future<String?> showMyDialog(BuildContext context) async {
_controller = TextEditingController();
final String? result = await showDialog(
context: context,
builder: (BuildContext context) => _buildMyDialog(context),
);
_controller = null;
return result;
}
//....
你可以檢查一下 _dependents.isEmpty': is not true
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411621.html
標籤:
