RenderFlex 子级具有非零 flex,但传入的高度约束在 flatter 中是无界的

时间:2021-06-15 10:46:23

标签: flutter dart

我有一个在 android studio 中编写的页面代码。在此页面上,我显示了一个对象列表,以及一个用于搜索这些对象的小部件。当我点击搜索小部件时,我遇到了以下问题:“在布局过程中抛出了以下语句: RenderFlex 在下方 31 像素处过于拥挤。

导致错误的相应小部件是:“但后来我找到了这个问题的答案并添加了“SingleChildScrollView”。 但是后来我遇到了这个问题:“RenderFlex 具有非零灵活性,但输入高度限制是无限的。” .我无法以任何方式解决它。我会很感激你的帮助。这是我的代码:

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: const EdgeInsets.all(8.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: SingleChildScrollView(

            child:Column(
              children: <Widget>[
                new Container(
                    color: Theme.of(context).primaryColor, child: _buildSearchBox()),

                new Expanded(
                    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'],
    );
  }
}

我的 scrin: enter image description here

我想使用搜索时的 scrin: enter image description here

0 个答案:

没有答案