Flutter: отображать наложение, даже если маршрут изменен действием пользователя

Самый простой способ сопоставить семантику C ++, которую вы показали на JavaScript, - заставить SWIG заставить функцию вести себя так, как если бы вы написали ее в реальном JavaScript вместо C ++. То есть мы собираемся заставить вашу функцию вести себя как следующий псевдословный псевдоним JavaScript:

function test(input) {
    if (error) {
        throw ....
    }
    return input;
}

Чтобы сделать это с помощью SWIG, нам нужно написать несколько typemaps. (В некоторых случаях эти типы уже существуют для нас как часть стандартной библиотеки SWIG, но для char ** нет такой типовой карты, потому что семантика немного менее очевидна).

Я сделал ваш код работать со следующим интерфейсом SWIG, аннотированным ниже:

%module test

// #1
%typemap(in,numinputs=0) char **output (char *tmp) {
    $1 = &tmp; // #2
}

// #3
%typemap(argout,fragment="SWIG_FromCharPtr") char **output {
    $result = SWIG_FromCharPtr(tmp$argnum);
    // Without more effort the following would be an illegal cast I think:
    //SWIG_AppendOutput($result, tmp$argnum);
}

// #4
%typemap(out) int test %{
    if ($1) {
        SWIG_exception_fail(SWIG_ERROR, "Well, that was unexpected");
    }
%}

%inline %{
int test(char *input, char **output) {
    *output = input;
    return 0;
}
%}

По существу, мы сделали здесь 4 вещи:

  1. Карта, которая устанавливает **output, без ввода кода JavaScript. numinputs=0 - это то, что подавляет необходимость получения аргумента из запросов JavaScript.
  2. Вместо этого мы используем локальную переменную, которая будет выводиться исключительно внутри оболочки
  3. После того, как функция была вызвана, используйте значение в нашей локальной переменной, так как функция вернется к JavaScript. Нам нужно ссылаться на него как на tmp$argnum, потому что SWIG внутренне пронумеровал локальную переменную, чтобы избежать столкновений, если карта-схема сопоставляется несколько раз в картотеке типов, но она не делает этого автоматически при обсуждении. Есть несколько стандартных макросов, которые SWIG поставляет для добавления вещей, чтобы возвращать несколько элементов, но здесь они не работают, потому что они заканчивают выполнение незаконного приведения, и мне все равно не нравится использовать эти семантики. Фрагмент здесь гарантирует, что у нас есть некоторая предварительно написанная поддержка строковых выходов, доступных в нашем сгенерированном коде.
  4. Сделайте что-то с исходным возвращаемым значением, в этом случае выведите исключение, если мы получим ненулевое значение (т.е. ошибка) из C ++. Существуют и другие способы решения этой проблемы, но это самый простой способ не просто игнорировать ошибки.

Я почти никогда не использовал поддержку JavaScript SWIG раньше, поэтому, как только я работал мой путь через основную документацию для создания модуля для меня было достаточным для запуска следующего теста:

var test = require("./build/Release/test");

console.log(test.test("blah blah"));

Работала так, как ожидалось. Я также сделал быстрый тест, изменив возвращаемое значение, чтобы заставить исключение, и которое вел себя так же, как и предполагалось.

Отказ от ответственности: это почти удвоило мое воздействие на узел / V8, поэтому тщательно проверяйте мои работы

0
задан skjagini 18 January 2019 в 21:45
поделиться

1 ответ

Используйте showModalBottomSheet больше примеров: modal_bottom_sheet_demo persistent_bottom_sheet_demo

экзамен:

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Modal bottom sheet'),
      ),
      body: Center(
        child: RaisedButton(
          child: const Text('SHOW BOTTOM SHEET'),
          onPressed: () {
            showModalBottomSheet<void>(
              context: context,
              builder: (BuildContext context) {
                return Container(
                  child: Padding(
                    padding: const EdgeInsets.all(32.0),
                    child: Text(
                      'This is the modal bottom sheet. Tap anywhere to dismiss.',
                      textAlign: TextAlign.center,
                      style: TextStyle(
                          color: Theme.of(context).accentColor, fontSize: 24.0),
                    ),
                  ),
                );
              },
            );
          },
        ),
      ),
    );
  }
0
ответ дан EdHuamani 18 January 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: