Flutter 颤振将内容包含到页面中
我实际上有一个搜索栏(自动完成)正在工作 当我选择一个结果时,displaynack()正在工作,它显示一个snackBar,但我想显示testList()的内容 我的目标是了解如何启动另一个小部件,以便能够一次又一次地在页面上添加新的小部件Flutter 颤振将内容包含到页面中,flutter,dart,widget,Flutter,Dart,Widget,我实际上有一个搜索栏(自动完成)正在工作 当我选择一个结果时,displaynack()正在工作,它显示一个snackBar,但我想显示testList()的内容 我的目标是了解如何启动另一个小部件,以便能够一次又一次地在页面上添加新的小部件 我的最终目标是一旦我有了所选的值,就发出一个http请求,获取一个列表作为返回并显示一个listview 该函数已执行(我可以在调试器中看到),但没有显示任何内容 (我是新手,请尽可能解释您的回答:)) 是的,我知道它是无效的 import 'packag
我的最终目标是一旦我有了所选的值,就发出一个http请求,获取一个列表作为返回并显示一个listview 该函数已执行(我可以在调试器中看到),但没有显示任何内容 (我是新手,请尽可能解释您的回答:)) 是的,我知道它是无效的
import 'package:drawer/src/share/snack_bar.dart';
import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import '../models/post_model.dart';
import '../services/http_service.dart';
// import 'package:http/http.dart' as http;
class PostsPage extends StatelessWidget {
final String title;
const PostsPage({Key? key, required this.title}) : super(key: key);
static Future<List<Post>> filterList(String value) async {
List<Post> list = await HttpService.fetchPosts();
return list.where(
(x) => x.title.toLowerCase().contains(value.toLowerCase())).toList();
}
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text(title),
),
body: SafeArea(
child: Container(
padding: EdgeInsets.all(16),
child: TypeAheadField<Post?>(
debounceDuration: Duration(milliseconds: 500),
hideSuggestionsOnKeyboardHide: false,
textFieldConfiguration: TextFieldConfiguration(
decoration: InputDecoration(
prefixIcon: Icon(Icons.search),
border: OutlineInputBorder(),
hintText: 'Select the namespace...',
),
),
suggestionsCallback: filterList,
itemBuilder: (context, Post? suggestion) {
final user = suggestion!;
return ListTile(
title: Text(user.title),
);
},
noItemsFoundBuilder: (context) => Container(
height: 100,
child: Center(
child: Text(
'No Namespace Found.',
style: TextStyle(fontSize: 24),
),
),
),
onSuggestionSelected: (Post? suggestion) {
final user = suggestion!;
displaySnack(context, ' Namespace: '+user.title);
testList(context); ################################ HERE
},
),
),
),
);
}
Widget testList(BuildContext context) {
return ListView.separated(
separatorBuilder: (BuildContext context, int index) => const Divider(),
itemCount: 2,
itemBuilder: (context, index) {
return Card(
child: ListTile(
title: Text("ppp"),
subtitle: Text("ppp"),
leading: CircleAvatar(
backgroundImage: NetworkImage(
"https://images.unsplash.com/photo-1547721064-da6cfb341d50"))
));
});
}
import'package:drawer/src/share/snack_bar.dart';
进口“包装:颤振/材料.省道”;
导入“包:flift_-typeahead/flift_-typeahead.dart”;
导入“../models/post_model.dart”;
导入“../services/http_service.dart”;
//将“package:http/http.dart”导入为http;
类PostsPage扩展了无状态小部件{
最后的字符串标题;
const PostsPage({Key?Key,必选this.title}):super(Key:Key);
静态未来筛选器列表(字符串值)异步{
List List=wait-HttpService.fetchPosts();
返回列表。在哪里(
(x) =>x.title.toLowerCase().contains(value.toLowerCase()).toList();
}
@凌驾
小部件构建(构建上下文)=>Scaffold(
appBar:appBar(
标题:文本(标题),
),
正文:安全区(
子:容器(
填充:边缘设置。全部(16),
子项:TypeAheadField(
去抖动持续时间:持续时间(毫秒:500),
隐藏建议OnKeyboard隐藏:false,
textFieldConfiguration:textFieldConfiguration(
装饰:输入装饰(
前缀:图标(Icons.search),
边框:OutlineInputBorder(),
hintText:'选择名称空间…',
),
),
suggestionsCallback:filterList,
itemBuilder:(上下文、帖子?建议){
最终用户=建议!;
返回列表块(
标题:文本(user.title),
);
},
noItemsFoundBuilder:(上下文)=>容器(
身高:100,
儿童:中心(
子:文本(
“未找到命名空间。”,
样式:TextStyle(字体大小:24),
),
),
),
onSuggestionSelected:(发布建议){
最终用户=建议!;
DisplaySnapshot(上下文“名称空间:”+user.title);
测试列表(上下文)
},
),
),
),
);
}
小部件测试列表(构建上下文){
返回ListView.separated(
separatorBuilder:(BuildContext上下文,int索引)=>const Divider(),
物品计数:2,
itemBuilder:(上下文,索引){
回程卡(
孩子:ListTile(
标题:文本(“ppp”),
字幕:文本(“ppp”),
领先:CircleAvatar(
背景图片:NetworkImage(
"https://images.unsplash.com/photo-1547721064-da6cfb341d50"))
));
});
}
我需要:所以你现在做的基本上就是用你的
testList()
函数调用创建一个ListView
,然后什么也不做,但是你想做的是让这个小部件显示在屏幕上,对吗
若你们创建了一个新的小部件,颤振不仅仅会显示它,你们还必须告诉它去渲染。想象一下,你正在准备小部件(例如小部件中的小部件),而flifter会在没有完成的情况下立即将其呈现到屏幕上,那就没那么好了
您需要将该小部件推到颤振提供给您的Navigator
小部件上
onSuggestionSelected: (Post? suggestion) {
final user = suggestion!;
displaySnack(context, ' Namespace: '+user.title);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => testList(context)),
);
}
我建议您阅读本文。您可以使用listView builder显示所选结果
onSuggestionSelected: (Post? suggestion) {
final user = suggestion!;
displaySnack(context, ' Namespace: '+user.title);
//get results
var results = fetchResult(suggestion);
//return a listview of the results
return ListView.builder(
physics: const AlwaysScrollableScrollPhysics(),
shrinkWrap: true,
scrollDirection: Axis.vertical,
itemCount: results.length,
itemBuilder: (_context, index) {
Post post = results[index];
return Card(
elevation: 2,
child: InkWell(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(6.0),
border: Border.all(color: Colors.black),
),
child: DefaultTextStyle(
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 12,
color: Colors.white),
child: Row(children: [
Expanded(
flex: 2,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(post.data),
],
),
),
]),
),
),
onTap: () {
//do something when user clicks on a result
},
));
}
},
onSuggestionSelected:(Post?suggestion){
最终用户=建议!;
DisplaySnapshot(上下文“名称空间:”+user.title);
//取得成果
var结果=fetchResult(建议);
//返回结果的列表视图
返回ListView.builder(
物理:常量AlwaysScrollablePhysics(),
收缩膜:对,
滚动方向:轴垂直,
itemCount:results.length,
itemBuilder:(_上下文,索引){
Post Post=结果[索引];
回程卡(
标高:2,
孩子:InkWell(
子:容器(
填充:边缘组。对称(水平:8,垂直:8),
装饰:盒子装饰(
边界半径:边界半径。圆形(6.0),
边框:边框。全部(颜色:颜色。黑色),
),
子项:DefaultTextStyle(
样式:TextStyle(
fontWeight:fontWeight.bold,
尺寸:12,
颜色:颜色。白色),
子对象:行(子对象:[
扩大(
弹性:2,
子:列(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
文本(后期数据),
],
),
),
]),
),
),
安大略省
List<Post> selectedPosts;
@override
void initState() {
super.initState();
selectedPosts = [];
}
@override
Widget build(BuildContext context) => Scaffold(
appBar: AppBar(
title: Text(title),
),
body: SafeArea(
child: Column(
children: [
Container(
padding: EdgeInsets.all(16),
child: TypeAheadField<Post?>(
debounceDuration: Duration(milliseconds: 500),
hideSuggestionsOnKeyboardHide: false,
textFieldConfiguration: TextFieldConfiguration(
decoration: InputDecoration(
prefixIcon: Icon(Icons.search),
border: OutlineInputBorder(),
hintText: 'Select the namespace...',
),
),
suggestionsCallback: filterList,
itemBuilder: (context, Post? suggestion) {
final user = suggestion!;
return ListTile(
title: Text(user.title),
);
},
noItemsFoundBuilder: (context) => Container(
height: 100,
child: Center(
child: Text(
'No Namespace Found.',
style: TextStyle(fontSize: 24),
),
),
),
onSuggestionSelected: (Post? suggestion) {
final user = suggestion!;
displaySnack(context, ' Namespace: '+user.title);
setState(()=> selectedPosts.add(suggestion));
},
),
),
testList(context),
],
),
),
);
itemCount: 2,
itemCount: selectedPosts?.length ?? 0,
class PostsPage extends StatefulWidget {
final String title;
const PostsPage({Key? key, required this.title}) : super(key: key);
static Future<List<Post>> filterList(String value) async {
// skip
}
@override
_PostsPageState createState() => _PostsPageState();
}
class _PostsPageState extends State<PostsPage> {
Post? user;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: SafeArea(
child: Column(
children: [
Container(
padding: EdgeInsets.all(16),
child: TypeAheadField<Post>(
// ...
// skip
// ...
onSuggestionSelected: (Post? suggestion) {
setState(() {
user = suggestion!;
displaySnack(context, ' Namespace: '+user.title);
});
},
),
),
Expanded(child: MyResult(post: user)),
],
),
),
);
}
}
class MyResult extends StatelessWidget {
const MyResult({
required this.post,
Key? key,
}) : super(key: key);
final Post? post;
Future<List<OtherObject>> getOtherObjects(Post? post) async{
if(post == null){
return [];
}else{
return Future.delayed(Duration(seconds:3),()=>[OtherObject(title: '001'),OtherObject(title: '002'),OtherObject(title: '003')]);
}
}
@override
Widget build(BuildContext context) {
return FutureBuilder<List<OtherObject>>(
future: getOtherObjects(post),
builder: (context, snapshot) {
if(snapshot.hasData && snapshot.connectionState == ConnectionState.done) {
final result = snapshot.data!;
return ListView.separated(
separatorBuilder: (BuildContext context,
int index) => const Divider(),
itemCount: result.length,
itemBuilder: (context, index) {
return Card(
child: ListTile(
title: Text(result[index].title),
subtitle: Text("ppp"),
leading: CircleAvatar(
backgroundImage: NetworkImage(
"https://images.unsplash.com/photo-1547721064-da6cfb341d50"),
),
),
);
},
);
}else {
return Center(child: CircularProgressIndicator());
}
}
);
}
}