使用 TextEditingController + onChanged - Flutter 打字时光标默认开始于 Textfield

Cursor defaults to start of Textfield when typing, using TextEditingController + onChanged - Flutter

我正在开发一个应用程序,它将有一些单行文本字段,这些文本字段基本上用于在每个文本字段中存储注释,因此我使用 shared_preferences 对 set/get 这些值的依赖性,但使用这个使用 TextEditingController 和 onChanged 参数,我发现键入时光标移动到文本字段的开头。

我研究过这个并且可以看到很多建议使用 TextSelection 的监听器(如下所示)将光标永久设置在文本字段的末尾,但我希望允许用户移动将光标放在该框中的任意位置以在他们喜欢的地方键入。

text1.addListener(() {
      final text = text1.text;
      text1.value = text1.value.copyWith(
        text: text,
        selection:
            TextSelection(baseOffset: text.length, extentOffset: text.length),
        composing: TextRange.empty,
      );
    });

下面是一个复制我遇到的问题的示例,如果有人有任何建议吗? 我可以使用保存按钮,但我希​​望只允许用户修改文本并将光标移动到他们需要的地方,然后 onChanged 参数可以保存对 shared_preferences;

的任何更改
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.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,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Textfield Test'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  
  TextEditingController text1 = TextEditingController();
  SharedPreferences sharedPreferences;

  @override
  void initState() {
    super.initState();
    getText();
  }
 

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
                controller: text1,
                onChanged: _setText,
              ),
          ],
        ),
      ),
    );
  }

  _setText(String value) async {
    sharedPreferences = await SharedPreferences.getInstance();
    setState(() {
      sharedPreferences.setString("text1", text1.text);
      getText();
    });
  }

  getText() async {
    sharedPreferences = await SharedPreferences.getInstance();
    setState(() {
        text1.text = sharedPreferences.getString("text1");
    });
  }

}

你必须等待这个函数的输出,因为这是异步函数。

onChanged: (value)async{
    _setText(value)
}

只是为了让任何人知道阅读这篇文章 post,我发现我哪里出错了。

在定义的 _setText 函数 id 上,我只需要删除行 'getText();',现在它不会在键入时移动光标,并且工作正常。