'Not able to convert DataModel Future List to a list item

I tried to add data from populateSearch() method into the allData List in Custom search, but it doesn't accept the data.

please help me to add the data from populateSearch() into the least in the Customsearch class during the initialization so that it would be used as suggestion list during search.

I tried to search over the internet and it has been now two days without solution.

import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:zhebsa_assistant/model/dzongkha_zhebsa.dart';
import '../../database/za_darabase.dart';
import 'search_result.dart';

class CustomSearch extends SearchDelegate {
  //bb
  final DatabaseService _databaseService = DatabaseService();
  late List<String> searchData;
  List<SearchDataModel> items = [];
  List<SearchDataModel> suggestion = [];
  // ListViewNoteState i = ListViewNoteState();

  Future<List<SearchDataModel>> _getSearch() async {
    return await _databaseService.populateSearch();
  }

  // final allData = [];
  List<String> allData = [
    'Abc',
    'Def',
    'བཀའ་སློབ།',
    'ཁྲག',
    'སྐུ་ཁྲག',
    'བཀབ་ནེ།',
  ];

  final recentData = [
    'བཀབ་ནེ།',
    'བཀའ་སློབ།',
    'ཁྲག',
    'སྐུ་ཁྲག',
  ];

  CustomSearch({
    String hintText = "འཚོལ།/Search",
  }) : super(
          searchFieldLabel: hintText,
          keyboardType: TextInputType.text,
          textInputAction: TextInputAction.search,
        );

  @override
  ThemeData appBarTheme(BuildContext context) {
    final ThemeData theme = Theme.of(context);
    // final InputDecorationTheme? searchFieldDecorationTheme;
    return theme.copyWith(
      dividerTheme: const DividerThemeData(
        color: Colors.white,
      ),
      // primaryIconTheme: const IconThemeData(color: Colors.white),

      scaffoldBackgroundColor: Colors.white, // for the body color
      // brightness: Brightness.dark,
      inputDecorationTheme: searchFieldDecorationTheme ??
          const InputDecorationTheme(
            // focusedBorder: UnderlineInputBorder(
            //   borderSide: BorderSide(color: Colors.white),
            // ),
            border: InputBorder.none,
            hintStyle: TextStyle(
              color: Colors.white,
            ),
          ),

      textSelectionTheme: const TextSelectionThemeData(
        cursorColor: Colors.white,
      ), // cursor color

      textTheme: Theme.of(context).textTheme.copyWith(
            headline6: const TextStyle(
              color: Colors.white,
              // fontSize: 20.0,
              decorationThickness: 0.0000001,
            ),
          ),
    );
  }

  @override
  List<Widget>? buildActions(BuildContext context) {
    return [
      IconButton(
        onPressed: () {
          if (query.isEmpty) {
            close(context, null);
          } else {
            query = '';
            showSuggestions(context);
          }
          // stopPronunciation();
          SearchResults(searchQuery: "").stopPronunciation();
        },
        icon: const Icon(Icons.clear),
      )
    ];
  }

  @override
  Widget? buildLeading(BuildContext context) {
    return IconButton(
      onPressed: () {
        close(context, null);
        // stopPronunciation();
        SearchResults(searchQuery: "").stopPronunciation();
      },
      // icon: const Icon(Icons.arrow_back),
      icon: AnimatedIcon(
        icon: AnimatedIcons.menu_arrow,
        progress: transitionAnimation,
      ),
    );
  }

  @override
  Widget buildResults(BuildContext context) {
    return SearchResults(searchQuery: query);
  }

  @override
  Widget buildSuggestions(BuildContext context) {
    
          final suggestionList = query.isEmpty
              ? recentData
              : allData.where((p) {
                  final dataLower = p.toLowerCase();
                  final queryLower = query.toLowerCase();
                  return dataLower.startsWith(queryLower);
                }).toList();
          return buildSuggestionsSuccess(suggestionList);
        
  }

  Widget buildSuggestionsSuccess(List<String> suggestionList) =>
      ListView.builder(
        itemCount: suggestionList.length,
        itemBuilder: (context, index) {
          final suggestion = suggestionList[index];
          final queryText = suggestion.substring(0, query.length);
          final remainingText = suggestion.substring(query.length);

          return ListTile(
            onTap: () {
              query = suggestion;
              showResults(context);
            },
            leading: const Icon(
              Icons.dangerous,
            ),
            title: RichText(
              text: TextSpan(
                  text: queryText,
                  style: const TextStyle(
                    color: Colors.black,
                    fontWeight: FontWeight.bold,
                  ),
                  children: [
                    TextSpan(
                      text: remainingText,
                      style: const TextStyle(color: Colors.black45),
                    ),
                  ]),
            ),
            // title: Text(suggestionList[index]),
          );
        },
      );
}

//SearchList Model
class SearchDataModel {
  final String sWord;
  SearchDataModel({required this.sWord});
  Map<String, dynamic> toMap() {
    return {
      'sWord': sWord,
    };
  }

  factory SearchDataModel.fromMap(Map<String, dynamic> map) {
    return SearchDataModel(
      sWord: map['sWord'],
    );
  }

  String toJson() => json.encode(toMap());

  factory SearchDataModel.fromJson(String source) =>
      SearchDataModel.fromMap(json.decode(source));
}

import 'dart:convert';

import '../model/dzongkha.dart';
import '../model/zhebsa.dart';
import '../model/dzongkha_zhebsa.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

class DatabaseService {
  static final DatabaseService _databaseService = DatabaseService._internal();
  factory DatabaseService() => _databaseService;
  DatabaseService._internal();

  static Database? _database;
  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDatabase();
    return _database!;
  }

  Future<Database> _initDatabase() async {
    final databasePath = await getDatabasesPath();
    final path = join(databasePath, 'zhebsa_assistant0.db');
    return await openDatabase(
      path,
      onCreate: _onCreate,
      version: 1,
      onConfigure: (db) async => await db.execute('PRAGMA foreign_keys = ON'),
    );
  }
  Future<void> _onCreate(Database db, int version) async {
    await db.execute(
      '''CREATE TABLE Dzongkha(
        dId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
        dWord TEXT NOT NULL UNIQUE, 
        dPhrase TEXT, 
        dHistory TEXT, 
        dFavourite TEXT, 
        dUpdateTime TEXT)''',
    );
    await db.execute(
      '''CREATE TABLE Zhebsa(
        zId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
        zWord TEXT NOT NULL UNIQUE, 
        zPhrase TEXT, 
        zPronunciation TEXT, 
        zHistory TEXT, 
        zFavourite TEXT, 
        zUpdateTime TEXT)''',
    );

    // Run the CREATE {dzongkha_zhebsa} TABLE statement on the database.
    await db.execute(
      'CREATE TABLE DzongkhaZhebsa(DzongkhadId INTEGER NOT NULL, ZhebsazId INTEGER NOT NULL, updateTime  TEXT, PRIMARY KEY (DzongkhadId, ZhebsazId), FOREIGN KEY(DzongkhadId) REFERENCES Dzongkha(dId) ON DELETE SET NULL, FOREIGN KEY(ZhebsazId) REFERENCES Zhebsa(zId) ON DELETE SET NULL)',
    );

    //Insert raw data to database
    var dt = DateTime.now();
    var dtStr = dt.toIso8601String();
    await db.rawInsert(
        'INSERT INTO Dzongkha(dId, dWord, dPhrase, dUpdateTime) VALUES(1, "བཀབ་ནེ།", "བཀབ་ནེ་བཀབ་གོ།", "$dtStr"),(2, "ཁ།", "ཁ། inn", "$dtStr"), (3, "བརྩེ་བ།", "བརྩེ་བ། kindness", "$dtStr")');
    await db.rawInsert(
        'INSERT INTO Zhebsa(zId, zWord, zPhrase, zPronunciation, zUpdateTime) VALUES(1, "སྐུ་གཟན།", "སྐུ་གཟན yes", "2.mp3", "$dtStr"), (2, "ན༌བཟའ།", "ན༌བཟའ་ཨིན།", "2.mp3", "$dtStr"), (3, "ཞལ།", "ཞལ། is correct", "3.mp3", "$dtStr"), (4, "བརྩེ་བ།", "བརྩེ་བ། honoriffic", "4.mp3", "$dtStr")');
    await db.rawInsert(
        'INSERT INTO DzongkhaZhebsa (DzongkhadId, ZhebsazId, updateTime) VALUES(1, 1, "$dtStr"), (1, 2, "$dtStr"), (2, 3, "$dtStr"), (3, 4, "$dtStr")');
  }

  Future<List<SearchDataModel>> populateSearch() async {
    final db = await _databaseService.database;
    final searchData = await db.rawQuery(
        '(SELECT dWord FROM Dzongkha) UNION (SELECT zWord FROM Zhebsa)');
    // return searchData.map((e) => SearchDataModel.fromMap(e)).toList();
    return List.generate(searchData.length,
        (index) => SearchDataModel.fromMap(searchData[index]));
  }

}


Solution 1:[1]

First, edit your SearchDataModel class like this:

class SearchDataModel {
  final String sWord;
  SearchDataModel({required this.sWord});

  factory SearchDataModel.fromMap(Map<String, Object?> map) =>
      SearchDataModel(sWord: map['sWord']);

  Map<String, Object?> toMap() => {'sWord': sWord};
}

Then, in your populateSearch() method, try this:

 Future<List<SearchDataModel>> populateSearch() async {
    final db = await _databaseService.database;
    final searchData = await db.rawQuery(
        '(SELECT dWord FROM Dzongkha) UNION (SELECT zWord FROM Zhebsa)');
    return searchData.map(SearchDataModel.fromMap).toList();
  }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Biplab Dutta