Макет автозаполнения текстового поля трепещущего

#flutter #dart

#трепетание #дротик

Вопрос:

Приветствую всех участников!

Я с нетерпением жду реализации следующего макета в flutter в соответствии с требованиями моего клиента.

Кроме того, он также должен быть AutoCompleteTextField. В настоящее время я использую библиотеку autocomplete_textfield от flutter, но я не могу получить макет, как указано на изображении, вместо этого он отображает обычный список в качестве предложений. Мне это нужно с флажком.

Если бы кто-нибудь мог мне помочь в этом или указать мне правильное направление, пожалуйста.

Спасибо

введите описание изображения здесь

Ответ №1:

Конечный результат:

введите описание изображения здесь

Вот пример того, как вы можете реализовать эту функцию:

 
import 'package:flutter/material.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: "Country List Example",
      ),
    );
  }
}

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

  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  List fullTaskDetailsList = [];
  List taskDetailsList = [];
  TextEditingController mycontroller = TextEditingController();
  List checkedFlag = List.filled(countryList.length, false);
  void searchMethodWithTest(String text) {
    List result = [];
    print("Text: "   text.length.toString());
    if (mycontroller.text.isNotEmpty) {
      fullTaskDetailsList.forEach((element) {
        text = text.trim();
        if (element["name"].toLowerCase().contains(text)) {
          result.add(element);
        }
      });
      print(taskDetailsList.toString());
      setState(() {
        taskDetailsList = resu<
      });
      return;
    } else {
      setState(() {
        taskDetailsList = fullTaskDetailsList;
      });
      return;
    }
  }

  @override
  void initState() {
    fullTaskDetailsList = countryList;
    taskDetailsList = fullTaskDetailsList;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: SingleChildScrollView(
        child: Center(
          child: Column(
            children: [
              TextField(
                controller: mycontroller,
                onChanged: (value) {
                  searchMethodWithTest(mycontroller.text.toLowerCase());
                },
                decoration: InputDecoration(
                  contentPadding: EdgeInsets.all(10),
                  hintText: "Search For Countries",
                ),
              ),
              Text("Searched for: ${mycontroller.text}"),
              Container(
                width: double.infinity,
                height: 400.0,
                child: ListView.builder(
                    itemCount: taskDetailsList.length,
                    itemBuilder: (context, index) {
                      return ListTile(
                        leading: Checkbox(
                            value: taskDetailsList[index]["checked"],
                            onChanged: (value) {
                              String name = taskDetailsList[index]["name"];
                              List temp = [];
                              fullTaskDetailsList.forEach((element) {
                                if (element["name"] == name) {
                                  print("hello");
                                  temp.add({
                                    "name": name,
                                    "checked": !element["checked"]
                                  });
                                } else {
                                  temp.add(element);
                                }
                              });
                              setState(() {
                                fullTaskDetailsList = temp;
                              });
                              searchMethodWithTest(mycontroller.text.toLowerCase());
                            }),
                        title: Text(
                          taskDetailsList[index]["name"],
                          style: TextStyle(
                            fontSize: 20.0,
                          ),
                        ),
                      );
                    }),
              )
            ],
          ),
        ),
      ),
      // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

const countryList = [
  {"name": "Afghanistan", "checked": true},
  {"name": "Albania", "checked": false},
  {"name": "Algeria", "checked": false},
  {"name": "American Samoa", "checked": false},
  {"name": "Andorra", "checked": false},
  {"name": "Angola", "checked": false},
  {"name": "Anguilla", "checked": false},
  {"name": "Antarctica", "checked": false},
  {"name": "Antigua and Barbuda", "checked": false},
  {"name": "Argentina", "checked": false},
  {"name": "Armenia", "checked": false}
];

 

Примечание: я использовал TextField вместо AutoCompleteTextField , но базовая логика не должна сильно меняться.

Комментарии:

1. можно ли напечатать значение флажка в редактируемом тексте, если он установлен?

2. Я не думаю, что понял, чего вы пытаетесь достичь здесь. можете ли вы быть более описательными, возможно, с грубым рисунком, чтобы прояснить ваш вариант использования.