Flutter 启动器 - 如何在卸载应用程序时更新应用程序列表?

Flutter launcher - How to update app list when I uninstall an app?

大家好,我是 Flutter 和编程的新手。我正在尝试创建一个带有 flutter 的 android 应用程序启动器。

我找遍了所有地方,但找不到问题的答案。

我正在使用包:device_apps

所以要检索我正在使用的应用程序列表

List<Application> apps = await DeviceApps.getInstalledApplications();

当我 install/uninstall 一个应用程序时,如何更新我的列表视图?

DeviceApps.getInstalledApplications() returns 一个 List<Application> 我们可以用来绘制我们的 ListView:

Widget _buildListView() {
  return ListView.builder(
      itemBuilder: (BuildContext context, int index) {
        Application app = _apps[index];
        return Column(
          children: <Widget>[
            ListTile(
              onTap: () => DeviceApps.openApp(app.packageName),
              title: Text('${app.appName} (${app.packageName})'),
            ),
            Divider()
          ],
        );
      },
      itemCount: _apps.length);
}

我们可以通过覆盖 StatefulWidget:

initState 方法初始化状态后立即加载已安装的应用程序
List<Application> _apps = [];

@override 
void initState() {
   super.initState();
   _loadApps();
}

Future<void> _loadApps() async {
  List<Application> applications = await DeviceApps.getInstalledApplications();
  setState(() => _apps = applications);
}

Widget _buildListView() {
  return ListView.builder(
      itemBuilder: (BuildContext context, int index) {
        Application app = _apps[index];
        return Column(
          children: <Widget>[
            ListTile(
              onTap: () => DeviceApps.openApp(app.packageName),
              title: Text('${app.appName} (${app.packageName})'),
            ),
            Divider()
          ],
        );
      },
      itemCount: _apps.length);
}

这样,我们也可以方便地使用GestureDetector重新加载已安装的应用程序:

Widget _buildRefreshButton() {
   return GesetureDetector(
      onTap: () async { await _loadApps(); }
      child: Text("Reload apps")
   );
}

最好的解决方案是在应用程序启动时收到通知 uninstalled/installed,但不幸的是,该软件包尚不支持此功能。

一个 hacky 解决方法是通过 Timer.periodic 轮询上面的 _loadApps(),但是,出于性能和用户体验的原因,不建议这样做。