1

我正在开发一个应用程序,该应用程序将具有一些单行文本字段,这些文本字段基本上用于在每个文本字段中存储注释,因此我使用 shared_preferences 依赖项来设置/获取这些值,但是将其与 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");
    });
  }

}
4

2 回答 2

0

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

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

于 2020-07-15T17:53:45.030 回答
0

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

onChanged: (value)async{
    _setText(value)
}
于 2020-07-11T10:13:35.733 回答