首页 > 解决方案 > 如何在颤动的搜索结果中增加窗口的大小?

问题描述

我有一个用 android studio 编写的页面代码。在这个页面上,我显示了一个对象列表,以及一个用于搜索这些对象的小部件。当我单击搜索小部件时,我的对象列表正在缩小,并且几乎不可见(它位于顶部)。这可以以某种方式修复,以便可以在整个页面上看到吗?

import 'package:flutter/material.dart';
import 'package:flutter_app_seals/model/post/form_unseals.dart';
import 'package:flutter_app_seals/model/post/form_seals.dart';
import  'package:flutter_app_seals/model/setting/globalvar.dart' as global;
import 'dart:async';
import 'dart:io';
import 'dart:convert';

void main() => runApp(JsonParseObjectSts_UN());
class JsonParseObjectSts_UN extends StatefulWidget {

  JsonParseObjectSts_UN() : super();

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

class _JsonParseObjectsState extends State <StatefulWidget> {
  List<UserDetails> _searchResult = [];
  List<UserDetails> _userDetails = [];
  TextEditingController controller = new TextEditingController();




  final String url = global.urlVar  ;
  // Get json result and convert it to model. Then add
  Future<Null> getUserDetails() async {


    HttpClient client = new HttpClient();
    client.badCertificateCallback = ((X509Certificate cert, String host, int port) => true);


    final request = await client
        .getUrl(Uri.parse(url))
        .timeout(Duration(seconds: 5));

    HttpClientResponse response = await request.close();


    var responseBody = await response.transform(utf8.decoder).join();


    final responseJson = json.decode(responseBody);

    setState(() {
      for (Map user in responseJson) {
        _userDetails.add(UserDetails.fromJson(user));
      }
    });
  }

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

    getUserDetails();
  }

  Widget _buildUsersList() {
    return new ListView.builder(
      itemCount: _userDetails.length,
      itemBuilder: (context, index) {
        return new Card(
          color: (_userDetails[index].sealed  == "Так") ? Colors.redAccent : Colors.greenAccent,
          margin: EdgeInsets.symmetric(vertical: 7),
          child: ListTile(
              title: Text(
                _userDetails[index].name,
                style: TextStyle(fontSize: 25),
              ),
              subtitle: Text("Запломбований:${_userDetails[index].sealed}"),
              leading: Icon(
                Icons.home_outlined,
                size: 30,
                color: Colors.black87,
              ),
              onTap: () =>
              {
                if ('Так' == _userDetails[index].sealed) {
                  global.nameObj =  _userDetails[index].name,
                  global.sealsNumb = _userDetails[index].seal_number,
                  global.typesOp = 'Так',
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => Unseals()),
                  )
                }
                else{
                  {
                    global.nameObj =  _userDetails[index].name,
                    global.typesOp = 'Ні',
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => Form_seals()),
                    )
                  }
                }
              }
          ),
        );
      },
    );
  }

  Widget _buildSearchResults() {
    return new ListView.builder(

      itemCount: _searchResult.length,
      itemBuilder: (context, i) {
        return new Card(
          color: (_searchResult[i].sealed  == "Так") ? Colors.redAccent : Colors.greenAccent,
          margin: EdgeInsets.symmetric(vertical: 7),
          child: ListTile(
              title: Text(
                _searchResult[i].name,
                style: TextStyle(fontSize: 25),
              ),
              subtitle: Text("Запломбований:${_searchResult[i].sealed}"),
              leading: Icon(
                Icons.home_outlined,
                size: 30,
                color: Colors.black87,
              ),
              onTap: () =>
              {
                if ('Так' == _searchResult[i].sealed) {
                  global.nameObj =  _searchResult[i].name,
                  global.sealsNumb = _searchResult[i].seal_number,
                  global.typesOp = 'Так',
                  Navigator.push(
                    context,
                    MaterialPageRoute(builder: (context) => Unseals()),
                  )
                }
                else{
                  {
                    global.nameObj =  _searchResult[i].name,
                    global.typesOp = 'Ні',
                    Navigator.push(
                      context,
                      MaterialPageRoute(builder: (context) => Form_seals()),
                    )
                  }
                }
              }
          ),
        );
      },
    );
  }

  Widget _buildSearchBox() {

    return new Padding(
      padding: EdgeInsets.all(7.0),
      child: new Card(

        child: new ListTile(
          leading: new Icon(Icons.search),
          title: new TextField(
            controller: controller,
            decoration: new InputDecoration(
                hintText: 'Пошук', border: InputBorder.none),
            onChanged: onSearchTextChanged,
          ),
          trailing: new IconButton(
            icon: new Icon(Icons.cancel),
            onPressed: () {
              controller.clear();
              onSearchTextChanged('');
            },
          ),
        ),
      ),
    );
  }
  Widget _buildBody() {

    return new Scaffold(
      body:Container(
        decoration: BoxDecoration(
          gradient: LinearGradient(
              colors: [Colors.blue, Colors.white],
              begin: Alignment.topCenter,
              end: Alignment.bottomCenter),
        ),
        child:Column(
          children: <Widget>[
           new Expanded( flex: 1, child: _buildSearchBox()),
            new Expanded(flex:8,
                child: _searchResult.length != 0 || controller.text.isNotEmpty
                    ? _buildSearchResults()
                    : _buildUsersList()),
          ],
        ),

      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        body: _buildBody()
    );
  }

  onSearchTextChanged(String text) async {
    _searchResult.clear();
    if (text.isEmpty) {
      setState(() {});
      return;
    }

    _userDetails.forEach((userDetail) {
      if (userDetail.name.contains(text) ) _searchResult.add(userDetail);
    });

    setState(() {});
  }
}


class UserDetails {

  final String name, seal_number,sealed;



  UserDetails({this.name, this.sealed, this.seal_number});

  factory UserDetails.fromJson(Map<String, dynamic> json) {
    return new UserDetails(
      sealed: json['sealed'],
      name: json['name'],
      seal_number: json['seal_number'],
    );
  }
}
我的页面: 在此处输入图像描述

我的搜索页面: 在此处输入图像描述

标签: flutterdart

解决方案


我已经多次查看您的代码,我只是注意到一个小错误。

对于搜索结果,您尝试在 ListView.builder 中显示搜索的“列表”,该列表位于父容器中的列中,没有定义的高度。

解决方法:给主容器设置一个高度,问题就解决了


推荐阅读