如何在Flutter中配置自定义Listview以及自定义可编辑子ListView?

如何解决如何在Flutter中配置自定义Listview以及自定义可编辑子ListView?

我有一个要实现的功能,我需要配置每个包含TextField和按钮的小部件的自定义列表视图。子窗口小部件包含每个窗口小部件的列表视图,其中包含一个用于输入新课程的TextField。

Overview

以下是功能。

  1. 第1步是进入课程的静态字段。
  2. 进入课程后,单击课程字段中的“添加”按钮将添加任何主题的动态窗口小部件的ListView(父listview)。
  3. 加载主题小部件后,单击右侧的添加按钮需要将另一个动态小部件的子级列表视图追加到子主题的父级(子级列表视图)。
  4. 因此,在上图中,2、4是父级列表视图,而3、5需要是子级列表视图

以下是我的代码。

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(debugShowCheckedModeBanner: false,home: NewCourse()));
}

class NewCourse extends StatefulWidget {
  @override
  _NewCourseState createState() => _NewCourseState();
}

class _NewCourseState extends State<NewCourse> {
  bool isTagSelected = false;
  bool isTopicCreationEnabled = false;

  List<NewTopic> newTopicList = [];

  addNewTopic() {
    newTopicList.add(new NewTopic());
    setState(() {});
  }

  enableTopicCreation(String txtTopicName) {
    setState(() {
      if (txtTopicName.length > 0) {
        isTopicCreationEnabled = true;
      } else {
        isTopicCreationEnabled = false;
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    var _createNewTopic;

    if (isTopicCreationEnabled) {
      _createNewTopic = () {
        addNewTopic();
      };
    } else {
      _createNewTopic = null;
    }

    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.blueGrey,title: Text('ALL COURSES'),centerTitle: true,),body: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,children: <Widget>[
          Container(
            color: Colors.blueGrey,child: Center(
              child: Padding(
                padding: EdgeInsets.all(20),child: Text(
                  "NEW COURSE",style: TextStyle(
                    fontSize: 20,fontWeight: FontWeight.bold,fontFamily: 'CodeFont',color: Colors.white,Container(
            padding: EdgeInsets.all(5),decoration: BoxDecoration(
              color: Colors.white,borderRadius: BorderRadius.circular(10),boxShadow: [
                BoxShadow(
                  color: Colors.grey[400],blurRadius: 20.0,offset: Offset(0,10),],child: Column(
              children: <Widget>[
                Row(
                  mainAxisAlignment: MainAxisAlignment.start,crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[
                    Expanded(
                      flex: 9,child: Container(
                        padding: EdgeInsets.all(8),margin: EdgeInsets.all(8),child: TextField(
                          onChanged: (text) {
                            enableTopicCreation(text);
                          },decoration: InputDecoration(
                            border: InputBorder.none,hintText: "Course Name",hintStyle: TextStyle(color: Colors.grey[400]),Expanded(
                      flex: 3,child: FlatButton(
                        onPressed: _createNewTopic,child: Container(
                          padding: EdgeInsets.all(18),child: Icon(
                            Icons.add_box,color: isTopicCreationEnabled
                                ? Colors.green
                                : Colors.blueGrey,Container(
            child: Expanded(
              child: getAllTopicsListView(),);
  }

  Widget getAllTopicsListView() {
    ListView topicList = new ListView.builder(
        itemCount: newTopicList.length,itemBuilder: (context,index) {
          return new ListTile(
            title: new NewTopic(),);
        });
    return topicList;
  }
}

class NewTopic extends StatefulWidget {
  @override
  _NewTopicState createState() => _NewTopicState();
}

class _NewTopicState extends State<NewTopic> {
  bool isSubTopicCreationEnabled = false;

  List<NewSubTopic> newSubTopicList = [];

  addNewSubTopic() {
    setState(() {
      newSubTopicList.add(new NewSubTopic());
    });
  }

  enableSubTopicCreation(String txtTopicName) {
    setState(
      () {
        if (txtTopicName.length > 0) {
          isSubTopicCreationEnabled = true;
        } else {
          isSubTopicCreationEnabled = false;
        }
      },);
  }

  @override
  Widget build(BuildContext context) {
    var _createNewSubTopic;

    if (isSubTopicCreationEnabled) {
      _createNewSubTopic = () {
        addNewSubTopic();
      };
    } else {
      _createNewSubTopic = null;
    }

    return Column(
      children: [
        Container(
          margin: EdgeInsets.only(top: 20,bottom: 20,left: 10,right: 50),padding: EdgeInsets.all(20),decoration: BoxDecoration(
            color: Colors.white,boxShadow: [
              BoxShadow(
                color: Colors.grey[400],child: Center(
            child: Column(
              children: <Widget>[
                Row(
                  mainAxisAlignment: MainAxisAlignment.start,child: Container(
                        child: TextField(
                          onChanged: (text) {
                            enableSubTopicCreation(text);
                          },hintText: "Enter the topic",child: FlatButton(
                        onPressed: _createNewSubTopic,child: Container(
                          child: Icon(
                            Icons.add_box,color: isSubTopicCreationEnabled
                                ? Colors.green
                                : Colors.blueGrey,Row(
                  children: <Widget>[
                    Container(
                      child: Expanded(
                        //child: Text("Hi There!"),child: getAllSubTopicsListView(),);
  }

  Widget getAllSubTopicsListView() {
    ListView subTopicList = new ListView.builder(
       itemCount: newSubTopicList.length,index) {
         return new ListTile(
           title: new NewSubTopic(),);
       },);
     return subTopicList;
  }
}

class NewSubTopic extends StatefulWidget {
  @override
  _NewSubTopicState createState() => _NewSubTopicState();
}

class _NewSubTopicState extends State<NewSubTopic> {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Container(
          margin: EdgeInsets.only(top: 20,left: 50,right: 10),child: Center(
            child: Container(
              child: TextField(
                decoration: InputDecoration(
                  border: InputBorder.none,hintText: "Enter the sub topic",);
  }
}

这是问题

Error

Assertion failed: file:///C:/src/flutter/packages/flutter/lib/src/rendering/sliver_multi_box_adaptor.dart:545:12
child.hasSize
is not true

任何帮助/建议将不胜感激。 预先感谢。

解决方法

您只需要收缩包装ListViews:

        ListView topicList = new ListView.builder(
          shrinkWrap: true,itemCount: newTopicList.length,//...
        ListView subTopicList = new ListView.builder(
          shrinkWrap: true,itemCount: newSubTopicList.length,

ListView基本上是一个CustomScrollView,其中包含单个SliverList 其CustomScrollView.slivers属性。

如果滚动视图不收缩包装,则滚动视图将扩展到scrollDirection中允许的最大大小。如果滚动视图在scrollDirection中具有无限制的约束,则收缩包装必须为true。

您可以在ListView中进一步了解shrinkWrapofficial documentaion

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-