использовать '& amp;' для создания указателя на член [duplicate]

Используйте WidgetsBinding.instance.addObserver , чтобы зарегистрировать WidgetsBindingObserver , на котором вы зацепили didChangeAppLifecycleState .

Есть пример здесь: https://github.com/flutter/flutter/blob/master/examples/layers/services/lifecycle.dart

9
задан James Kolpack 25 March 2010 в 17:44
поделиться

4 ответа

Большинство API-интерфейсов предоставляют аргумент «пользовательские данные» размера указателя, который будет выглядеть следующим образом:

GConn* gnet_conn_new (const gchar *hostname, 
                  gint port, 
                  GConnFunc func,
                  void* user_data); 

Это позволит вам передать экземпляр в user_data и передать вашу функцию C на функция-член вроде этого:

void my_func(GConn *conn, void* user_data)
{
    ((MyClass*)user_data)->MyMemberFunc(conn);
}

Возможно, ваш API имеет альтернативный или аналогичный параметр «пользовательские данные» где-то. В противном случае вы не сможете сделать это без globals или statics.

12
ответ дан AshleysBrain 20 August 2018 в 18:31
поделиться

Короткий ответ, вы не можете.

Длинный ответ:

Учитывая достаточную свободу действий API, которую вам нужно позвонить, вы можете настроить функцию, которую вы просто регистрируете, и звоните в качестве посредника. Обычно функции обратного вызова позволяют включать дополнительные данные, которые передаются этой функции вместе с информацией, сгенерированной объектом, вызывающим обратный вызов. Обычно он называется чем-то вроде «client_data» и имеет тип void * или long. Если это так, вы можете просто использовать эти данные, чтобы включить достаточную информацию для вызова функции, которую вы хотите, в нужном экземпляре, например, в режиме boost :: function & lt;>.

Обратите внимание, что этот посредник функция, которая делегирует вашу функцию-член, может быть статическим членом или свободной функцией.

К сожалению, у вас нет этой опции, так что ваша работа будет вдвойне жесткой. Вам действительно нужен какой-то способ убедиться, что этому правильному экземпляру присваивается сообщение, и вам не удастся определить этот экземпляр из данных обратного вызова. Есть несколько вариантов, которые могут или не могут работать для вас:

  1. убедитесь, что вы никогда не используете более одного экземпляра в качестве своей целевой функции обратного вызова. Зарегистрируйте этот экземпляр с одноточечным или глобальным каким-либо видом, который отслеживает один экземпляр времени, на которое следует ссылаться на события этого типа.
  2. Зарегистрируйте столько экземпляров, сколько хотите, и просто убедитесь, что все они получают сообщение а затем либо с этим справиться, либо нет. Вы можете использовать своего рода «цепочку ответственности» здесь, где задана возможность иметь дело с событием, а затем возвращает что-то, позволяющее петле знать, следует ли продолжать или останавливаться.

В заключение, нет прямого способа сделать то, что вы хотите, но могут быть ответы на получение того, что вам нужно, если вы рассмотрите варианты. Любая функция, используемая в качестве обратного вызова, предоставляемая функции API C, должна ссылаться как указатель на функцию, а не на указатель на элемент любого рода ... и, к сожалению, не является также и функтором. C не знает, как справляться с этими вещами, поэтому ваш обратный вызов должен быть свободной функцией или статическим членом.

2
ответ дан Crazy Eddie 20 August 2018 в 18:31
поделиться
2
ответ дан jwismar 20 August 2018 в 18:31
поделиться

Вам понадобится функция-обертка, чтобы справиться с этим, или вы можете сделать статический my_func (при условии, что ему не нужно обращаться к каким-либо переменным экземпляра).

3
ответ дан Paul R 20 August 2018 в 18:31
поделиться
Другие вопросы по тегам:

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