Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在Flatter中的streambuilder顶部添加文本框?_Flutter_Flutter Layout - Fatal编程技术网

Flutter 如何在Flatter中的streambuilder顶部添加文本框?

Flutter 如何在Flatter中的streambuilder顶部添加文本框?,flutter,flutter-layout,Flutter,Flutter Layout,我的结构一定有问题 我有一个使用Firestore动态构建的listview,它工作得很好,但是我试图在列表顶部添加一个文本框,以便创建一个“过滤器”或“搜索” 下面是示例代码: import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:cloud_firestore/cloud_firestore.da

我的结构一定有问题

我有一个使用Firestore动态构建的listview,它工作得很好,但是我试图在列表顶部添加一个文本框,以便创建一个“过滤器”或“搜索”

下面是示例代码:

import 'dart:ui';

import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
//  static const String _title = 'Flutter Code Sample';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Testing App',
      theme: ThemeData(
        primarySwatch: Colors.deepPurple,
      ),
      // home: MyHomePage(title: 'Testing App'),
      home: Scaffold(
        body: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

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

class _MyHomePageState extends State<MyHomePage> {

  Widget _buildListItem(BuildContext context, DocumentSnapshot document){
    return Card(
        //height: 50,
        color: Colors.amber[600],
      //padding: EdgeInsets.all(2.0),
      child: Row(
        children: [
          Container(
            padding: EdgeInsets.all(5.0),
            color: Colors.red,
            child: Text("Image"),
            width: 85,
              //height: 75
          ),
          Expanded(
              //color: Colors.cyan,
              //padding: EdgeInsets.all(2.0),
              child: Row(
                  //crossAxisAlignment: CrossAxisAlignment.stretch,
                mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                children: [
                  Column(
                    children: [
                      //Icon(Icons., color: Colors.green[500]),
                      Text("Text 1", style: TextStyle(fontWeight: FontWeight.bold)),
                      Text(document['test1'].toString()),
                      Text("Text 2", style: TextStyle(fontWeight: FontWeight.bold)),
                      Text(document['test2'].toString()),
                    ],
                  ),
                  ]
              )
          ),
        ],
      ),

    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Testing App"),
      ),
      body:
        <<------ ADD TEXT BOX HERE ---->>
        StreamBuilder(
            stream: FirebaseFirestore.instance.collection('firestoretest').snapshots(),
            builder: (context, snapshot) {
              if (!snapshot.hasData) return const Text('Loading...');
              return ListView.builder(
                  itemExtent: 80.0,
                  itemCount: snapshot.data.docs.length,
                  itemBuilder: (context, index) =>
                      _buildListItem(context, snapshot.data.docs[index])
              );
            }
        ),
    );
  }
}
导入“dart:ui”;
进口“包装:颤振/材料.省道”;
导入“包:firebase_core/firebase_core.dart”;
导入“包:cloud_firestore/cloud_firestore.dart”;
void main()异步{
WidgetsFlutterBinding.ensureInitialized();
等待Firebase.initializeApp();
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
//静态常量字符串_title='颤振代码示例';
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“测试应用程序”,
主题:主题数据(
原色样本:颜色。深紫色,
),
//主页:我的主页(标题:“测试应用程序”),
家:脚手架(
正文:MyHomePage(),
),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
小部件_buildListItem(BuildContext上下文,DocumentSnapshot文档){
回程卡(
//身高:50,
颜色:颜色。琥珀色[600],
//填充:所有边缘设置(2.0),
孩子:排(
儿童:[
容器(
填充:所有边缘设置(5.0),
颜色:颜色,红色,
子项:文本(“图像”),
宽度:85,
//身高:75
),
扩大(
//颜色:Colors.cyan,
//填充:所有边缘设置(2.0),
孩子:排(
//crossAxisAlignment:crossAxisAlignment.stretch,
mainAxisAlignment:mainAxisAlignment.space,
儿童:[
纵队(
儿童:[
//图标(图标,颜色:Colors.green[500]),
文本(“文本1”,样式:TextStyle(fontWeight:fontWeight.bold)),
文本(文档['test1'].toString()),
文本(“文本2”,样式:TextStyle(fontWeight:fontWeight.bold)),
文本(文档['test2'].toString()),
],
),
]
)
),
],
),
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“测试应用程序”),
),
正文:
StreamBuilder(
流:FirebaseFirestore.instance.collection('firestoretest').snapshots(),
生成器:(上下文,快照){
如果(!snapshot.hasData)返回常量文本('Loading…');
返回ListView.builder(
项目范围:80.0,
itemCount:snapshot.data.docs.length,
itemBuilder:(上下文,索引)=>
_buildListItem(上下文、快照、数据、文档[索引])
);
}
),
);
}
}
我曾尝试在儿童中添加streambuilder,但没有任何结果

这是我在谷歌教程中找到的示例的修改版本

非常感谢您的帮助

看看这是否解决了问题

return Scaffold(
    appBar: AppBar(
      title: Text("Testing App"),
    ),
    body: Column(
      children: [
        Text("<<------ ADD TEXT BOX HERE ---->>"),
        Expanded(
          child: StreamBuilder(
              stream: FirebaseFirestore.instance
                  .collection('firestoretest')
                  .snapshots(),
              builder: (context, snapshot) {
                if (!snapshot.hasData) return const Text('Loading...');
                return ListView.builder(
                    itemExtent: 80.0,
                    itemCount: snapshot.data.docs.length,
                    itemBuilder: (context, index) =>
                        _buildListItem(context, snapshot.data.docs[index]));
              }),
        )
      ],
    ));
返回脚手架(
appBar:appBar(
标题:文本(“测试应用程序”),
),
正文:专栏(
儿童:[
正文(“”),
扩大(
孩子:StreamBuilder(
流:FirebaseFirestore.instance
.collection('firestoretest')
.snapshots(),
生成器:(上下文,快照){
如果(!snapshot.hasData)返回常量文本('Loading…');
返回ListView.builder(
项目范围:80.0,
itemCount:snapshot.data.docs.length,
itemBuilder:(上下文,索引)=>
_buildListItem(上下文、快照、数据、文档[索引]);
}),
)
],
));

在streamBuilder中,用列包装ListviewBuilder,并在其顶部放置文本小部件。使用listView builder的ShrinkWrap属性并将其设置为“true”,这就是为什么您看不到任何结果,因为存在render flex错误。 像这样:

StreamBuilder(
  stream: FirebaseFirestore.instance.collection('firestoretest').snapshots(),
  builder: (context, snapshot) {
          if (!snapshot.hasData) return const Text('Loading...');
          return Column(children[
          Text('Hiii'),
          ListView.builder(
          shrinkWrap: true, 
          //This is very important, without shrinkWrap, you'll get an error 
          //saying:'package:flutter/src/rendering/box.dart':
          //Failed assertion: line 1940 pos 12: 'hasSize'
          //The relevant error-causing widget was Column.

            itemExtent: 80.0,
            itemCount: snapshot.data.docs.length,
            itemBuilder: (context, index) =>
                      _buildListItem(context, snapshot.data.docs[index])
              ]));
            }
        ),

我也会试试这个谢谢!正如您所提到的,您希望添加一个文本框用于搜索,您将需要来自流的最新更新项,这就是为什么我假设它应该位于流生成器中的原因。