首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将Widget注入自定义子Widget并使用子部件迭代索引?

如何将Widget注入自定义子Widget并使用子部件迭代索引?
EN

Stack Overflow用户
提问于 2019-01-04 08:13:16
回答 2查看 1.3K关注 0票数 4

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

代码语言:javascript
运行
复制
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

在构建了这个类之后,我将它放在示例类中。

示例类:

代码语言:javascript
运行
复制
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和一个文本。但是当我在写课文的时候,我意识到我不能把我想要的东西放进去。这是因为在示例类中没有定义“index”。

在我的示例类中,有什么好的方法可以将这篇文章放入我的示例类吗?

完整法典:

代码语言:javascript
运行
复制
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"])
          );
        },
     );
   }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-04 08:48:54

不必将一个Widget传递给您的自定义AppList,您可以传递一个构建器函数,该函数返回一个Widget并根据需要接受参数,例如索引和任何所需的配置。如下所示:

功能定义:

代码语言:javascript
运行
复制
typedef Widget MyListTileBuilder(int index);

然后更改以下内容:

代码语言:javascript
运行
复制
final Widget child;

代码语言:javascript
运行
复制
final MyListTileBuilder childBuilder;

当然,您需要在示例类中实现构建器方法:

代码语言:javascript
运行
复制
Widget MyListTileBuilderImplementation (int index) {
  return ListTile ( 
                title: Text(installedApps[index]["app_name"]) //this is the text
              ),
}

在示例类中构建AppList时,传递方法

代码语言:javascript
运行
复制
AppList (
              childBuilder: MyListTileBuilderImplementation 
)

最后,在AppList内部调用构建器,而不是添加子小部件:

代码语言:javascript
运行
复制
    itemBuilder: (context, index) {
      return childBuilder(index); //This is where the ListTile will go. 
    },

包含这些更改的完整代码如下所示(我不得不注释掉您没有提供的引用):

代码语言:javascript
运行
复制
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);
        },
     );
   }

}
票数 1
EN

Stack Overflow用户

发布于 2019-01-04 08:43:41

下面是您的修复代码:

代码语言:javascript
运行
复制
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"]}')
          );
        },
     );
   }

}

你试图给标题一个表达式的值,而不仅仅是一个变量。你需要把它括在括号里。

这被认为是一个表达式,因此必须按如下方式编写:

标题:文本(‘${installedAppsindex}’)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54035219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档