无法继续更改与 GetX 正常工作



我正在学习GetX。我试图写一个简单的应用程序,显示文本字段,并允许编辑它。因此,用户可以点击默认文本并继续编辑它。

但我对onChange动作和控制器感到困惑。我不确定我是否正确使用它们,因为下一个代码没有在控制台中打印注释,所以似乎TextEditingController没有与数据绑定。

这里是复制代码:

import 'package:flutter/material.dart';
import 'package:flutter_application_1/controller.dart';
import 'package:get/get_core/src/get_main.dart';
import 'package:get/get.dart';

void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
var mycontroller = Get.put(MyController());
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
body: Container(child: TextField(
controller: TextEditingController(text: mycontroller.text),
onChanged: (value) {
mycontroller.changeText();
}
))
));
}
}

控制器:

import 'package:flutter/material.dart';
import 'package:get/get_state_manager/get_state_manager.dart';
import 'package:get/get_rx/src/rx_types/rx_types.dart';
class MyController extends GetxController {
var _text = "".obs;
TextEditingController _controller;
get text => this._text.value;
set text(value) => this._text.value = value;

@override
void onInit() async  {
super.onInit();
_controller = TextEditingController();
_text.value = "Hello World"; 
_controller.addListener(changeText);
}
changeText() {
_text.value = _controller.text;
print(_text.value); // nothing is printed on Console!
}
}

第二个问题。如果我需要两个文本字段,我需要如何组织代码?我需要不同的_controller.addListener(changeText);像:_controller.addListener(changeText1); _controller.addListener(changeText2);吗?

获取textfield的值,因为它的变化可以通过利用Textfieldcontroller以及通过使用onchanged方法来完成,您在代码中部署它们,这是不必要的。您可以通过任何一种方式监视文本字段值。在上面阅读更多内容https://flutter.dev/docs/cookbook/forms/text-field-changes。

如果你想使用Textfieldcontroller,它(Textfieldcontroller)需要在MyController中创建,这有点复杂,我不使用这种方法。如何在GetX中使用onchanged如下所述。

mycontroller.dart

var _text = "".obs;
get getText => _text.value;
set setText(String screenvalue) => _text.value = screenvalue;
// there is no need of initiating textcontroller here in mycontroller.dart

yourscreen.dart

class MyApp extends StatelessWidget {
final mycontroller = Get.put(MyController());
// intiate TextEditingController in screen
var textValueController = TextEditingController();
home: Scaffold(
body: 

Column(
children: [  

Container(child: TextField(
// initiate TextEditingController normally in screen itself 
// if you wish to use it for purpose of submitting form data
// or for validation purpose
controller: textValueController,
onChanged: (value) {
mycontroller.setText (value);
}
)),
Obx(() {
return Text(
'Your text updated as typed = ${mycontroller.getText}',
);
}),

],
))}

Dmitry,

我也在学习GetX,所以还没有100%掌握。

作为初学者,看起来您正在使用两个不同的textedingcontrollers !一个在MyController中,一个在MyApp中,可能需要将MyController设为非私有,并在MyApp中使用。

第二个问题很简单,因为你可以/应该为每个文本字段创建一个texttedingcontroller。