Я задал вопрос под названием «Как внедрить виджет в пользовательский дочерний виджет и использовать индекс итерации дочерних виджетов?» Я уже получил ответ, но есть проблема.
В ответе сказано, что я должен:
"Вместо передачи виджета в пользовательский список приложений вы можете передать функцию-конструктор, которая возвращает виджет и принимает необходимые параметры, например, индекс и любую необходимую конфигурацию. Что-то вроде следующего:
Определение функции:
typedef Widget MyListTileBuilder(String tileText);
затем измените следующее:
final Widget child;
до
final MyListTileBuilder childBuilder;
конечно, вам нужно реализовать свой метод конструктора в примере класса:
Widget MyListTileBuilderImplementation (int index) {
return ListTile (
title: Text(installedApps[index]["app_name"]) //this is the text
),
}
когда вы строите AppList внутри примера класса, вы передаете метод
AppList (
childBuilder: MyListTileBuilderImplementation
)
и, наконец, внутри AppList вы вызываете конструктор вместо добавления дочернего виджета ":
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';
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"])
);
},
);
}
}