createInstance function Null safety

Future<void> createInstance(
  1. Function mountedFn,
  2. TextEditingController nameController,
  3. dynamic statusMsg(
    1. String,
    2. {bool loading}
    ),
  4. TextEditingController locationController,
  5. WSLApi api,
  6. TextEditingController autoSuggestBox,
  7. TextEditingController userController,
  8. BuildContext context
)

Implementation

Future<void> createInstance(
    Function mountedFn,
    TextEditingController nameController,
    Function(String, {bool loading}) statusMsg,
    TextEditingController locationController,
    WSLApi api,
    TextEditingController autoSuggestBox,
    TextEditingController userController,
    BuildContext context) async {
  plausible.event(name: "wsl_create");
  String label = nameController.text;
  // Replace all special characters with _
  String name = label.replaceAll(RegExp('[^A-Za-z0-9]'), '_');
  if (name != '') {
    statusMsg('creatinginstance-text'.i18n(), loading: true);
    String location = locationController.text;
    if (location == '') {
      location = prefs.getString("SaveLocation") ?? defaultPath;
      location += '/$name';
    }
    var result = await api.create(
        name, autoSuggestBox.text, location, (String msg) => statusMsg(msg));
    if (result.exitCode != 0) {
      statusMsg(result.stdout);
    } else {
      String user = userController.text;
      if (user != '') {
        List<int> processes = await api.exec(name, [
          'apt-get update',
          'apt-get install -y sudo',
          'useradd -m -s /bin/bash -G sudo $user',
          'passwd $user',
          'echo \'$user ALL=(ALL) NOPASSWD:ALL\' >> /etc/sudoers.d/wslsudo',
          'echo -e \'[user]\ndefault = $user\' > /etc/wsl.conf',
        ]);
        bool success = true;
        for (dynamic process in processes) {
          if (process != 0) {
            success = false;
            break;
          }
        }
        if (success) {
          prefs.setString('StartPath_$name', '/home/$user');
          prefs.setString('StartUser_$name', user);
          bool mounted = mountedFn();
          if (!mounted) {
            return;
          }
          Navigator.pop(context);

          statusMsg('createdinstance-text'.i18n());
        } else {
          bool mounted = mountedFn();
          if (!mounted) {
            return;
          }
          Navigator.pop(context);
          statusMsg('createdinstancenouser-text'.i18n());
        }
      } else {
        bool mounted = mountedFn();
        if (!mounted) {
          return;
        }
        if (Navigator.canPop(context)) {
          Navigator.pop(context);
        }
        // Install fake systemctl
        if (autoSuggestBox.text.contains('Turnkey')) {
          // Set first start variable
          prefs.setBool('TurnkeyFirstStart_$name', true);
          statusMsg('installingfakesystemd-text'.i18n(), loading: true);
          WSLApi().execCmds(
              name,
              [
                'wget https://raw.githubusercontent.com/bostrot/'
                    'fake-systemd/master/systemctl -O /usr/bin/systemctl',
                'chmod +x /usr/bin/systemctl',
                '/usr/bin/systemctl',
              ],
              onMsg: (output) => null,
              onDone: () => statusMsg('createdinstance-text'.i18n()));
        } else {
          statusMsg('createdinstance-text'.i18n());
        }
      }
      // Save distro label
      prefs.setString('DistroName_$name', label);
      // Save distro path
      prefs.setString('Path_$name', location);
    }
    // Download distro check
  } else {
    statusMsg('entername-text'.i18n());
  }
}