Flutter Desktop, как получить имя профиля пользователя Windows?

Я хочу получить имя профиля пользователя Windows из моего настольного приложения Flutter. Есть ли способ получить его?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
184
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метод win32 для этого — GetUserName . Вместо того, чтобы мучиться с настройкой плагина с каналом метода, мы можем вызвать это напрямую с помощью ffi. Вам понадобятся пакеты ffi и win32.

import 'dart:ffi';

import 'package:ffi/ffi.dart';
import 'package:win32/win32.dart';

// This is the max win32 username length. It is missing from the win32 package,
// so we'll just create our own constant.
const unLen = 256;

String getUsername() {
  return using<String>((arena) {
    final buffer = arena.allocate<Utf16>(sizeOf<Uint16>() * (unLen + 1));
    final bufferSize = arena.allocate<Uint32>(sizeOf<Uint32>());
    bufferSize.value = unLen + 1;
    final result = GetUserName(buffer, bufferSize);
    if (result == 0) {
      GetLastError();
      throw Exception(
          'Failed to get win32 username: error 0x${result.toRadixString(16)}');
    }
    return buffer.toDartString();
  });
}

Это также работает для x64, если я только изменю параметры x32 на x64?

aoiTenshi 07.10.2022 10:38

Насколько я знаю, все это не зависит от архитектуры. Я тестировал его на 64-битной машине с Windows 11. Как вы думаете, какая часть зависит от архитектуры?

jmatth 07.10.2022 16:01

Я думал о длине имени пользователя и uint.

aoiTenshi 07.10.2022 17:07

Функция использует uint32 независимо от архитектуры процессора. Я не могу найти альтернативные версии заголовочного файла с большим значением UN_LEN. Если вы хотите быть параноиком, вы можете выделить больше байтов на случай, если Microsoft увеличит максимальную длину имен пользователей в будущем. Лично я бы не стал беспокоиться, но дополнительный килобайт или около того оперативной памяти, который используется для одного вызова и мгновенно освобождается, вряд ли вызовет проблемы в любой современной системе.

jmatth 07.10.2022 23:32

Другие вопросы по теме