Android 类型';未来<;动态>';不是类型为';列表<;应用程序>';
我正在尝试在flatter中创建一个搜索小部件,用于我使用device_apps()使用的应用程序列表。但是我得到一个错误“类型‘Future’不是类型‘List?’的子类型”。为了创建搜索小部件,我使用了来自的帮助 这是我的密码:Android 类型';未来<;动态>';不是类型为';列表<;应用程序>';,android,flutter,flutter-dependencies,Android,Flutter,Flutter Dependencies,我正在尝试在flatter中创建一个搜索小部件,用于我使用device_apps()使用的应用程序列表。但是我得到一个错误“类型‘Future’不是类型‘List?’的子类型”。为了创建搜索小部件,我使用了来自的帮助 这是我的密码: import 'dart:async'; import 'package:device_apps/device_apps.dart'; import 'package:flutter/material.dart'; class SearchWidget ext
import 'dart:async';
import 'package:device_apps/device_apps.dart';
import 'package:flutter/material.dart';
class SearchWidget extends StatelessWidget {
SearchWidget({Key key}) : super(key: key);
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Column(
children: <Widget>[
TextField(onChanged: _filter),
StreamBuilder<List<Application>>(
initialData: lelist(),
stream: _stream,
builder:
(BuildContext context, AsyncSnapshot<List<Application>> snapshot) {
print(snapshot.data);
return ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
return Text(snapshot.data[index].appName);
},
);
},
)
],
),
);
}
}
StreamController<List<Application>> _streamController = StreamController<List<Application>>();
Stream<List<Application>> get _stream => _streamController.stream;
_filter(String searchQuery) {
List<Application> _filteredList = lelist()
.where((Application app) => app.appName.toLowerCase().contains(searchQuery.toLowerCase()))
.toList();
_streamController.sink.add(_filteredList);
}
lelist() async {
List<Application> _dataFromQuerySnapShot = await DeviceApps.getInstalledApplications(includeAppIcons: true);
_dataFromQuerySnapShot.sort((a, b) {
return a.appName.toString().toLowerCase().compareTo(b.appName.toString().toLowerCase());
});
return _dataFromQuerySnapShot;
}
导入'dart:async';
导入“包:设备应用程序/设备应用程序.dart”;
进口“包装:颤振/材料.省道”;
类SearchWidget扩展了无状态Widget{
SearchWidget({Key}):超级(Key:Key);
@凌驾
小部件构建(构建上下文){
返回SingleChildScrollView(
子:列(
儿童:[
文本字段(一旦更改:_过滤器),
StreamBuilder(
initialData:lelist(),
溪流:_溪流,
建设者:
(BuildContext上下文,异步快照){
打印(快照数据);
返回ListView.builder(
收缩膜:对,
itemCount:snapshot.data.length,
itemBuilder:(构建上下文,int索引){
返回文本(snapshot.data[index].appName);
},
);
},
)
],
),
);
}
}
StreamController _StreamController=StreamController();
Stream get _Stream=>_streamController.Stream;
_过滤器(字符串搜索查询){
列表_filteredList=lelist()
.where((应用程序app)=>app.appName.toLowerCase().contains(searchQuery.toLowerCase())
.toList();
_streamController.sink.add(_filteredList);
}
lelist()异步{
列表_dataFromQuerySnapShot=Wait DeviceApps.GetInstalledApplication(包括应用图标:true);
_dataFromQuerySnapShot.sort((a,b){
返回a.appName.toString().toLowerCase().compareTo(b.appName.toString().toLowerCase());
});
从QuerySnapshot返回_数据;
}
我想你需要在给未来打电话后添加asList
lelist() async {
List<Application> _dataFromQuerySnapShot = await
DeviceApps.getInstalledApplications(includeAppIcons: true);
_dataFromQuerySnapShot.sort((a, b) {
return
a.appName.toString().toLowerCase().compareTo(b.appName.toString().toLowerCase());
}) as List;
return _dataFromQuerySnapShot;
lelist()异步{
列表_dataFromQuerySnapShot=wait
DeviceApps.GetInstalledApplication(包括应用图标:true);
_dataFromQuerySnapShot.sort((a,b){
返回
a、 appName.toString().toLowerCase().compareTo(b.appName.toString().toLowerCase());
})as列表;
从QuerySnapshot返回_数据;
}我认为没有必要在每次击键时加载和排序已安装的应用程序,从而将所有这些逻辑置于初始状态。这也使您的
\u过滤器
功能同步
import 'dart:async';
import 'package:device_apps/device_apps.dart';
import 'package:flutter/material.dart';
class SearchWidget extends StatefulWidget {
SearchWidget({Key key}) : super(key: key);
@override
_SearchWidgetState createState() => _SearchWidgetState();
}
class _SearchWidgetState extends State<SearchWidget> {
final _streamController = StreamController<List<Application>>();
List<Application> _dataFromQuerySnapShot;
Stream<List<Application>> get _stream => _streamController.stream;
@override
void initState() {
DeviceApps.getInstalledApplications(includeAppIcons: true)
.then((List<Application> apps) {
_dataFromQuerySnapShot = apps;
_dataFromQuerySnapShot.sort((a, b) {
return a.appName
.toString()
.toLowerCase()
.compareTo(b.appName.toString().toLowerCase());
});
_streamController.sink.add(_dataFromQuerySnapShot);
});
super.initState();
}
@override
void dispose() {
_streamController.close();
super.dispose();
}
_filter(String searchQuery) {
final filteredApplications = _dataFromQuerySnapShot
.where((Application app) =>
app.appName.toLowerCase().contains(searchQuery.toLowerCase()))
.toList();
_streamController.sink.add(filteredApplications);
}
@override
Widget build(BuildContext context) {
return SingleChildScrollView(
child: Column(
children: <Widget>[
TextField(onChanged: _filter),
StreamBuilder<List<Application>>(
stream: _stream,
builder: (BuildContext context,
AsyncSnapshot<List<Application>> snapshot) {
if (!snapshot.hasData) {
return Center(child: CircularProgressIndicator());
}
return snapshot.data.isEmpty
? Center(child: Text('Empty'))
: ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
return Text(snapshot.data[index].appName);
},
);
},
)
],
),
);
}
}
导入'dart:async';
导入“包:设备应用程序/设备应用程序.dart”;
进口“包装:颤振/材料.省道”;
类SearchWidget扩展了StatefulWidget{
SearchWidget({Key}):超级(Key:Key);
@凌驾
_SearchWidgetState createState()=>\u SearchWidgetState();
}
类_SearchWidgetState扩展状态{
最终_streamController=streamController();
列表\u来自QuerySnapshot的数据;
Stream get _Stream=>_streamController.Stream;
@凌驾
void initState(){
DeviceApps.GetInstalledApplication(包括应用图标:true)
.然后((列出应用程序){
_dataFromQuerySnapShot=应用程序;
_dataFromQuerySnapShot.sort((a,b){
返回a.appName
.toString()
.toLowerCase()
.compareTo(b.appName.toString().toLowerCase());
});
_streamController.sink.add(_dataFromQuerySnapShot);
});
super.initState();
}
@凌驾
无效处置(){
_streamController.close();
super.dispose();
}
_过滤器(字符串搜索查询){
最终筛选应用程序=\u来自QuerySnapshot的数据
.其中((应用程序应用程序)=>
app.appName.toLowerCase().contains(searchQuery.toLowerCase())
.toList();
_streamController.sink.add(filteredApplications);
}
@凌驾
小部件构建(构建上下文){
返回SingleChildScrollView(
子:列(
儿童:[
文本字段(一旦更改:_过滤器),
StreamBuilder(
溪流:_溪流,
生成器:(BuildContext上下文,
异步快照(快照){
如果(!snapshot.hasData){
返回中心(子项:CircularProgressIndicator());
}
返回snapshot.data.isEmpty
?居中(子项:文本('Empty'))
:ListView.builder(
收缩膜:对,
itemCount:snapshot.data.length,
itemBuilder:(构建上下文,int索引){
返回文本(snapshot.data[index].appName);
},
);
},
)
],
),
);
}
}
我尝试过,但出现了错误:“参数类型‘Future’无法分配给参数类型‘List’”。您不能使用lelist()
作为初始数据的值,因为它返回的是Future。为initialData提供不同的值,或者将其删除,并在等待流中的第一个值时使用类似于if(!snapshot.hasData){return CircularProgressIndicator()}
的内容。首先感谢您的回复,我在一个拼贴项目中工作,并在这方面停留了好几天。我删除了初始数据并使用了CircularProgressIndicator()…但现在正在打印(snapshot.data)我得到了I/flatter(26265):null,循环指示器正在旋转,没有显示任何列表。。。。。。当我在文本字段中输入单词时,控制台中出现了另一个错误:未处理的异常:类型“Future”不是类型“List”的子类型我尝试使用initialData:lelist()作为List,但它显示了相同的错误:“Future”不是类型castNo中类型“List”的子类型,即使使用as List,仍然会出现相同的错误。