Курсор по умолчанию запускает текстовое поле при вводе с использованием TextEditingController + onChanged - Flutter - PullRequest
0 голосов
/ 11 июля 2020

Я разрабатываю приложение, которое будет иметь несколько однострочных текстовых полей, которые по существу используются для хранения заметок в каждом, поэтому я использую зависимость shared_preferences для установки / получения этих значений, но использую это с TextEditingController и параметром onChanged, который я нахожу курсор перемещается в начало текстового поля при вводе.

Я исследовал это и вижу много предложений по использованию Listener (как показано ниже) для 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");
    });
  }

}

Ответы [ 2 ]

0 голосов
/ 15 июля 2020

Просто чтобы кто-нибудь знал, читая этот пост, я обнаружил, где я ошибся.

В определенном идентификаторе функции _setText мне просто нужно было удалить строку 'getText ();', и теперь она не перемещает курсор при наборе текста и работает нормально.

0 голосов
/ 11 июля 2020

вам нужно подождать, пока вывод этой функции не будет, потому что это асинхронная c функция.

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