简体   繁体   English

Flutter 条码扫描结果未列出

[英]Flutter Barcode Scan Result Is'nt Listed

My application is to search through the list of books.我的应用程序是搜索书籍列表。 Two different variables (book name or barcode) can be used while searching.搜索时可以使用两个不同的变量(书名或条形码)。 There is no problem when searching by name.按名称搜索时没有问题。 but when searching with barcode scanning, no results are listed.但是使用条码扫描搜索时,没有列出任何结果。 When I type the barcode manually, the application still works without any problems.当我手动输入条形码时,该应用程序仍然可以正常工作,没有任何问题。

Can u help me?你能帮我吗?

Manually entered barcode: https://i.stack.imgur.com/njtLA.png手动输入条码: https : //i.stack.imgur.com/njtLA.png

Barcode scan result : https://i.stack.imgur.com/ZsGot.png条码扫描结果: https : //i.stack.imgur.com/ZsGot.png

My code here..我的代码在这里..

import 'package:fff/book_tile.dart';
import 'package:flutter/material.dart';
import 'package:flutter_barcode_scanner/flutter_barcode_scanner.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:fff/book_model.dart';

class HomePage extends StatefulWidget {

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

class _HomePageState extends State<HomePage> {
  TextEditingController _controller = new TextEditingController();
  List<Book> _booksForDisplay = [];
  List<Book> _books = [];


  @override
  void initState() {
    super.initState();
    fetchBooks().then((value) {
      setState(() {
        _books.addAll(value);
        _booksForDisplay = _books;
        print(_booksForDisplay.length);
      });
    });
  }


  Future _scan(BuildContext context) async {
    String barcode = await FlutterBarcodeScanner.scanBarcode(
        '#ff0000',
        'İptal',
        true,
        ScanMode.BARCODE
    );
    _controller.text = barcode;
  }

    @override
    Widget build(BuildContext context) {
      return Scaffold(
          appBar: AppBar(
            toolbarHeight: 80,
            title: Padding(
              padding: EdgeInsets.all(8),
              child: Container(
                decoration: BoxDecoration(
                    color: Colors.white,
                    borderRadius: BorderRadius.circular(40)
                ),
                child: Padding(
                  padding: EdgeInsets.symmetric(horizontal: 12),
                  child: TextFormField(
                    textAlignVertical: TextAlignVertical.center,
                    controller: _controller,
                    decoration: InputDecoration(
                        border: InputBorder.none,
                        icon: Icon(Icons.search),
                        suffixIcon: IconButton(
                          icon: Icon(FontAwesomeIcons.barcode),
                          onPressed: (){
                            _scan(context);
                          },
                        )
                    ),
                    onChanged: (string){
                      string = string.toLowerCase();
                      setState(() {
                        _booksForDisplay = _books.where((b){
                          var bName = b.name!.toLowerCase();
                          var bBarcode = b.barcode!.toLowerCase();
                          return bName.startsWith(string) || bBarcode.startsWith(string);
                        }).toList();
                      });
                    },
                  ),
                ),
              ),
            ),
          ),
          body: SafeArea(
            child: Container(
                child: _controller.text.isNotEmpty ? new ListView.builder(
                  itemCount: _booksForDisplay.length,
                  itemBuilder: (context, index){
                    return BookTile(book: this._booksForDisplay[index]);
                  },
                )
                    :
                Center(
                  child: Text('Searching..'),
                )
            ),
          )
      );
    }
  }

I think you only need a listener for your TextEditingController.我认为你只需要一个你的 TextEditingController 的监听器。 And you should write your onChanged method inside that listener.并且您应该在该侦听器中编写您的 onChanged 方法。

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

    fetchBooks().then((value) {
      setState(() {
        _books.addAll(value);
        _booksForDisplay = _books;
        print(_booksForDisplay.length);
      });
    });

    _controller.addListener(() {
       print(_controller.text);

       var string = _controller.text.toLowerCase();
       setState(() {
            _booksForDisplay = _books.where((b){
                var bName = b.name!.toLowerCase();
                var bBarcode = b.barcode!.toLowerCase();
                return bName.startsWith(string) || 
                       bBarcode.startsWith(string);
                }).toList();
          });                   
    });
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM