User interface 如何将小部件注入自定义子小部件并使用子小部件迭代索引?

User interface 如何将小部件注入自定义子小部件并使用子小部件迭代索引?,user-interface,dart,flutter,frontend,custom-widgets,User Interface,Dart,Flutter,Frontend,Custom Widgets,我正在构建一个颤振应用程序。我构建了一个包含构造函数的类。我创建了构造函数,以便可以自定义我的ListTile,因为我将这个类用于多个页面,每次都需要更改文本颜色,有时甚至需要添加一个onTap函数 class AppList extends StatefulWidget { @override AppListState createState() => AppListState(); AppList({Key key, this.child}) : super(k

我正在构建一个颤振应用程序。我构建了一个包含构造函数的类。我创建了构造函数,以便可以自定义我的ListTile,因为我将这个类用于多个页面,每次都需要更改文本颜色,有时甚至需要添加一个onTap函数

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
类AppList扩展StatefulWidget{
@凌驾
AppListState createState()=>AppListState();
AppList({Key-Key,this.child}):super(Key:Key);
最后一个孩子;
}
类AppListState扩展状态{
小部件儿童;
列出已安装的应用程序;
@凌驾
void initState(){
super.initState();
}
getApps(){
设置状态(){
installedApps=_installedApps;
getApp();
});
}
@凌驾
小部件构建(构建上下文){
如果(installedApps==null)
getApps();
返回ListView.builder(
itemCount:installedApps==null?0:installedApps.length,
itemBuilder:(上下文,索引){
return child;//这是ListTile将要去的地方。
},
);
}
}
//为了防止你感到困惑,我为一些功能使用了一个插件
在我构建这个类之后,我把它放在我的示例类中

示例类:

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
              ),
            )
          )  
        ),
      );
    }

} 
类示例扩展了StatefulWidget{
@凌驾
ExampleState createState()=>ExampleState();
}
类ExampleState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
家:脚手架(
主体:容器(
颜色:颜色,黑色,
孩子:阿普利斯特(
儿童:ListTile(
标题:Text(installedApps[index][“app_name”])//这是文本
),
)
)  
),
);
}
} 
之后,我添加了一个ListTile和一个文本。但是当我在写课文的时候,我意识到我不能把我想要的课文放进去。这是因为示例类中没有定义“index”

有没有一个好方法可以把这篇文章放到我的示例课上

完整代码:

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"])
          );
        },
     );
   }

}
导入“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
导入“dart:async”;
导入“dart:io”;
进口“包装:flutter_appavailability/flutter_appavailability.dart”;
void main(){
SystemChrome.SetEnabledSystemEmioVerlays([]);
runApp(示例());
}
Future getApp()异步{
if(Platform.isAndroid){
installedApps=等待AppAvailability.getInstalledApps();
打印(等待AppAvailability.checkAvailability(“com.android.chrome”);
打印(wait AppAvailability.isappeabled(“com.android.chrome”);
}
else if(Platform.isIOS){
installedApps=iOSApps;
打印(等待AppAvailability.checkAvailability(“calshow://”);
}
}
列出已安装的App;
列出已安装的应用程序;
列出iOSApps=[
{
“应用程序名称”:“日历”,
“程序包名称”:“calshow://”
},
{
“应用程序名称”:“Facebook”,
“包名称”:“fb://”
},
{
“应用程序名称”:“Whatsapp”,
“包装名称”:“whatsapp://”
}
];
类示例扩展StatefulWidget{
@凌驾
ExampleState createState()=>ExampleState();
}
类ExampleState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
家:脚手架(
主体:容器(
颜色:颜色,黑色,
子项:AppList()
)  
),
);
}
}
类AppList扩展StatefulWidget{
@凌驾
AppListState createState()=>AppListState();
AppList({Key-Key,this.child}):super(Key:Key);
最后一个孩子;
}
类AppListState扩展状态{
小部件儿童;
列出已安装的应用程序;
@凌驾
void initState(){
super.initState();
}
getApps(){
设置状态(){
installedApps=_installedApps;
getApp();
});
}
@凌驾
小部件构建(构建上下文){
如果(installedApps==null)
getApps();
返回ListView.builder(
itemCount:installedApps==null?0:installedApps.length,
itemBuilder:(上下文,索引){
返回列表块(
标题:文本(installedApps[索引][“应用程序名称”])
);
},
);
}
}

以下是您的修复代码:

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 (
            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"]}')
          );
        },
     );
   }

}
导入“包装:颤振/材料.省道”;
导入“包:flifter/services.dart”;
导入“dart:async”;
导入“dart:io”;
进口“包装:flutter_appavailability/flutter_appavailability.dart”;
void main(){
SystemChrome.SetEnabledSystemEmioVerlays([]);
runApp(示例());
}
Future getApp()异步{
if(Platform.isAndroid){
installedApps=等待AppAvailability.getInstalledApps();
打印(等待AppAvailability.checkAvailability(“com.android.chrome”);
打印(wait AppAvailability.isappeabled(“com.android.chrome”);
}
else if(Platform.isIOS){
installedApps=iOSApps;
打印(等待AppAvailability.checkAvailability(“calshow://”);
}
}
列出已安装的App;
列出已安装的应用程序;
列出iOSApps=[
{
“应用程序名称”:“日历”,
“程序包名称”:“calshow://”
},
{
“应用程序名称”:“Facebook”,
“包名称”:“fb://”
},
{
“应用程序名称”:“Whatsapp”,
“包装名称”:“whatsapp://”
}
];
类示例扩展StatefulWidget{
@凌驾
ExampleState createState()=>ExampleState();
}
类ExampleState扩展了状态{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
家:脚手架(
主体:容器(
子项:AppList()
)  
),
);
}
}
类AppList扩展StatefulWidget{
@凌驾
AppListState createState()=>AppListState();
AppList({Key-Key,this.child}):super(Key:Key);
最后一个孩子;
}
类AppListState扩展状态{
小部件儿童;
列出已安装的应用程序;
@凌驾
void initState(){
super.initState();
}
格塔普
typedef Widget MyListTileBuilder(int index);
final Widget child;
final MyListTileBuilder childBuilder;
Widget MyListTileBuilderImplementation (int index) {
  return ListTile ( 
                title: Text(installedApps[index]["app_name"]) //this is the text
              ),
}
AppList (
              childBuilder: MyListTileBuilderImplementation 
)
    itemBuilder: (context, index) {
      return childBuilder(index); //This is where the ListTile will go. 
    },
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

import 'dart:async';
import 'dart:io';

//import 'package:flutter_appavailability/flutter_appavailability.dart';

typedef Widget MyListTileBuilder(int index);

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=[
  {"app_name":"app1"},
  {"app_name":"app2"},
  {"app_name":"app3"},
];
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> {

  Widget MyListTileBuilderImplementation (int index) {
    return ListTile ( 
                  title: Text(installedApps[index]["app_name"] + "  index:" + index.toString()) //this is the text
                );
  }

  @override
    Widget build(BuildContext context) {
      return MaterialApp (
        debugShowCheckedModeBanner: false,
        home: Scaffold (
          body: Container (
            color: Colors.white,
            child: AppList (childBuilder: this.MyListTileBuilderImplementation)
          )  
        ),
      );
    }

}

class AppList extends StatefulWidget {

  @override
    AppListState createState() => AppListState();

  AppList({Key key, this.childBuilder}) : super(key: key);

  final MyListTileBuilder childBuilder;

}

class AppListState extends State<AppList> {

  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  widget.childBuilder(index);
        },
     );
   }

}