dart - 我无法添加 Text(installedApps[index]["app_name"]) 因为 'index' 没有定义。如何添加此文本?
问题描述
我正在构建一个颤振应用程序。我已经构建了一个带有构造函数的类。我制作了构造函数,这样我就可以自定义我的 ListTile
像这样:
class AppList extends StatefulWidget {
@override
AppListState createState() => AppListState();
AppList({Key key, this.child}) : super(key: key);
final Widget child;
}
class AppListState extends State<AppList> {
Widget child;
List<Map<String, String>> _installedApps;
@override
void initState() {
super.initState();
}
getApps() {
setState(() {
installedApps = _installedApps;
getApp();
});
}
@override
Widget build(BuildContext context) {
if (installedApps == null)
getApps();
return ListView.builder(
itemCount: installedApps == null ? 0 : installedApps.length,
itemBuilder: (context, index) {
return child; //This is where the ListTile will go.
},
);
}
}
//Just in case you were confused, I used a plugin for some of the features
在我建立了这个类之后,我把它放在了我的示例类中。
示例类:
class Example extends StatefulWidget {
@override
ExampleState createState() => ExampleState();
}
class ExampleState extends State<Example> {
@override
Widget build(BuildContext context) {
return MaterialApp (
debugShowCheckedModeBanner: false,
home: Scaffold (
body: Container (
color: Colors.black,
child: AppList (
child: ListTile (
title: Text(installedApps[index]["app_name"]) //this is the text
),
)
)
),
);
}
}
然后,我在其中添加了一个 ListTile 和一个文本。但是当我在写文本时,我意识到我无法写出我想要的文本。这是因为示例类中没有定义“索引”。
有没有一种好方法可以将此文本放入我的示例类中?
完整代码:
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:async';
import 'dart:io';
import 'package:flutter_appavailability/flutter_appavailability.dart';
void main() {
SystemChrome.setEnabledSystemUIOverlays([]);
runApp(Example());
}
Future<void> getApp() async {
if (Platform.isAndroid) {
installedApps = await AppAvailability.getInstalledApps();
print(await AppAvailability.checkAvailability("com.android.chrome"));
print(await AppAvailability.isAppEnabled("com.android.chrome"));
}
else if (Platform.isIOS) {
installedApps = iOSApps;
print(await AppAvailability.checkAvailability("calshow://"));
}
}
List<Map<String, String>> installedApp;
List<Map<String, String>> installedApps;
List<Map<String, String>> iOSApps = [
{
"app_name": "Calendar",
"package_name": "calshow://"
},
{
"app_name": "Facebook",
"package_name": "fb://"
},
{
"app_name": "Whatsapp",
"package_name": "whatsapp://"
}
];
class Example extends StatefulWidget {
@override
ExampleState createState() => ExampleState();
}
class ExampleState extends State<Example> {
@override
Widget build(BuildContext context) {
return MaterialApp (
debugShowCheckedModeBanner: false,
home: Scaffold (
body: Container (
color: Colors.black,
child: AppList ()
)
),
);
}
}
class AppList extends StatefulWidget {
@override
AppListState createState() => AppListState();
AppList({Key key, this.child}) : super(key: key);
final Widget child;
}
class AppListState extends State<AppList> {
Widget child;
List<Map<String, String>> _installedApps;
@override
void initState() {
super.initState();
}
getApps() {
setState(() {
installedApps = _installedApps;
getApp();
});
}
@override
Widget build(BuildContext context) {
if (installedApps == null)
getApps();
return ListView.builder(
itemCount: installedApps == null ? 0 : installedApps.length,
itemBuilder: (context, index) {
return ListTile (
title: Text(installedApps[index]["app_name"])
);
},
);
}
}
解决方案
为什么不将 ListTile 小部件放在 ListView 构建器中?
像这样:
return ListView.builder(
itemCount: installedApps == null ? 0 : installedApps.length,
itemBuilder: (BuildContext context, int index){
return ListTile(
title: Text(installedApps[index]["app_name"])
);
)
因为我怀疑即使你得到了索引,你仍然必须找到一种方法来从你的 AppListState 类访问你的 installedApps 变量到你的 ExampleState 类。
而且您可能希望在 getApps() 方法之外声明您的 installedApps 变量,就像您在 _installedApps 变量中所做的那样。像这样:
List<Map<String, String>> installedApps;
最后,getApp() 函数有什么作用?您的 _installedApps 变量如何获取数据?
更新
我修改了您的代码并使用了 FutureBuilder 小部件。
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_appavailability/flutter_appavailability.dart';
void main() {
SystemChrome.setEnabledSystemUIOverlays([]);
runApp(Example());
}
class Example extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp (
debugShowCheckedModeBanner: false,
home: Scaffold (
body: Container (
color: Colors.white,
child: AppList ()
)
),
);
}
}
class AppList extends StatefulWidget {
AppList({Key key}) : super(key: key);
@override
AppListState createState() => AppListState();
}
class AppListState extends State<AppList> {
//List<Map<String, String>> installedApp;
List<Map<String, String>> installedApps;
List<Map<String, String>> iOSApps = [
{
"app_name": "Calendar",
"package_name": "calshow://"
},
{
"app_name": "Facebook",
"package_name": "fb://"
},
{
"app_name": "Whatsapp",
"package_name": "whatsapp://"
}
];
Future<List<Map<String, String>>> getApp() async {
if (Platform.isAndroid) {
installedApps = await AppAvailability.getInstalledApps();
print(await AppAvailability.checkAvailability("com.android.chrome"));
print(await AppAvailability.isAppEnabled("com.android.chrome"));
}
else if (Platform.isIOS) {
installedApps = iOSApps;
print(await AppAvailability.checkAvailability("calshow://"));
}
return installedApps;
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: getApp(),
builder: (BuildContext context, AsyncSnapshot<List<dynamic>> snapshot){
switch(snapshot.connectionState){
case ConnectionState.none:
return Text('None');
case ConnectionState.active:
case ConnectionState.waiting:
return Text('Awaiting result...');
case ConnectionState.done:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
if (!snapshot.hasData)
return Text('No Data');
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
return ListTile (
title: Text(snapshot.data[index]["app_name"])
);
},
);
}
}
);
}
}
推荐阅读
- ajax - Codeigniter API,数据库错误请求返回对象而不是设置响应
- bash - 如何在 Dockerfile RUN 命令中为可执行文件设置标志?
- tensorflow - 如何在 Jupyter Notebook 中运行来自 Google Colaboratory 的特定代码?
- macos - 如何在 MacOS 上将多个 mach-o 文件与终端链接
- python - Python ConnectionRefusedError:[WinError 10061]
- sql-server - ms sql server全文索引选项未激活
- elasticsearch - Elasticsearch:在大纪元之前存储和查询日期
- bash - 通过 crontab 调用的 sh 脚本杀死进程
- java - 具有整数和用户输入的 ArrayList
- keras - 在不运行模型的情况下计算 Keras 中的损失