Аргумент delegate
в SliverList
не обязательно является SliverChildListDelegate
.
Вы также можете использовать SliverChildBuilderDelegate
для достижения эффекта builder
ListView.builder
SliverList(delegate: SliverChildBuilderDelegate((context, index) {
return Container();
}));
. Я рекомендовал бы использовать регистрирующийся инструментарий такой в качестве log4j. Вход настраивается через файлы свойств во времени выполнения, и можно включить / от функций, таких как номер строки / вход имени файла.
Рассмотрение javadoc для PatternLayout дает Вам полный список опций - что Вы, после %L.
Log4J позволяет Вам включать номер строки как часть его выходного шаблона. См. http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html для получения дополнительной информации о том, как сделать это (основной элемент в шаблоне преобразования является "L"). Однако Javadoc действительно включает следующее:
ПРЕДУПРЕЖДЕНИЕ, Генерирующее информацию о местоположении вызывающего абонента, является чрезвычайно медленным. Это - использование, должен избежаться, если скорость выполнения не является проблемой.
Код, отправленный @simon.buchan, будет работать...
Thread.currentThread().getStackTrace()[2].getLineNumber()
, Но если Вы называете его в методе, это будет всегда возвращаться, номер строки строки в методе поэтому скорее используют встроенный фрагмент кода.
Я вынужден ответить, не ответив на Ваш вопрос. Я предполагаю, что Вы ищете номер строки только для поддержки отладки. Существуют лучшие пути. Существуют hackish способы получить текущую строку. Все, что я видел, медленно. Вы - более обеспеченное использование платформы журналирования как этот в java.util.logging пакете или log4j. Используя эти пакеты можно настроить информацию о входе для включения контекста вниз в имя класса. Затем каждое сообщение журнала было бы достаточно уникально для знания, куда оно прибыло из. В результате Ваш код будет иметь переменную 'регистратора', которую Вы называете через
logger.debug("a really descriptive message")
вместо
System.out.println("a really descriptive message")
Если это было скомпилировано для выпуска, это не возможно. Вы могли бы хотеть изучить что-то как Log4J, который автоматически даст Вам достаточно информации для определения достаточно близко, где зарегистрированный код произошел.
<забастовка> От Angsuman Chakraborty : забастовка>
/** Get the current line number.
* @return int - Current line number.
*/
public static int getLineNumber() {
return Thread.currentThread().getStackTrace()[2].getLineNumber();
}
сначала общий метод (в служебном классе, в простом java1.4 кодируют, хотя, Вам, вероятно, придется переписать его для java1.5 и больше)
/**
* Returns the first "[class#method(line)]: " of the first class not equal to "StackTraceUtils" and aclass. <br />
* Allows to get past a certain class.
* @param aclass class to get pass in the stack trace. If null, only try to get past StackTraceUtils.
* @return "[class#method(line)]: " (never empty, because if aclass is not found, returns first class past StackTraceUtils)
*/
public static String getClassMethodLine(final Class aclass) {
final StackTraceElement st = getCallingStackTraceElement(aclass);
final String amsg = "[" + st.getClassName() + "#" + st.getMethodName() + "(" + st.getLineNumber()
+")] <" + Thread.currentThread().getName() + ">: ";
return amsg;
}
Затем определенный служебный метод получить право stackElement:
/**
* Returns the first stack trace element of the first class not equal to "StackTraceUtils" or "LogUtils" and aClass. <br />
* Stored in array of the callstack. <br />
* Allows to get past a certain class.
* @param aclass class to get pass in the stack trace. If null, only try to get past StackTraceUtils.
* @return stackTraceElement (never null, because if aClass is not found, returns first class past StackTraceUtils)
* @throws AssertionFailedException if resulting statckTrace is null (RuntimeException)
*/
public static StackTraceElement getCallingStackTraceElement(final Class aclass) {
final Throwable t = new Throwable();
final StackTraceElement[] ste = t.getStackTrace();
int index = 1;
final int limit = ste.length;
StackTraceElement st = ste[index];
String className = st.getClassName();
boolean aclassfound = false;
if(aclass == null) {
aclassfound = true;
}
StackTraceElement resst = null;
while(index < limit) {
if(shouldExamine(className, aclass) == true) {
if(resst == null) {
resst = st;
}
if(aclassfound == true) {
final StackTraceElement ast = onClassfound(aclass, className, st);
if(ast != null) {
resst = ast;
break;
}
}
else
{
if(aclass != null && aclass.getName().equals(className) == true) {
aclassfound = true;
}
}
}
index = index + 1;
st = ste[index];
className = st.getClassName();
}
if(isNull(resst)) {
throw new AssertionFailedException(StackTraceUtils.getClassMethodLine() + " null argument:" + "stack trace should null"); //$NON-NLS-1$
}
return resst;
}
static private boolean shouldExamine(String className, Class aclass) {
final boolean res = StackTraceUtils.class.getName().equals(className) == false && (className.endsWith(LOG_UTILS
) == false || (aclass !=null && aclass.getName().endsWith(LOG_UTILS)));
return res;
}
static private StackTraceElement onClassfound(Class aclass, String className, StackTraceElement st) {
StackTraceElement resst = null;
if(aclass != null && aclass.getName().equals(className) == false)
{
resst = st;
}
if(aclass == null)
{
resst = st;
}
return resst;
}
Вы не можете гарантировать непротиворечивость номера строки с кодом, особенно если это будет скомпилировано для выпуска. Я не рекомендовал бы использовать номера строки с этой целью так или иначе, будет лучше дать полезную нагрузку места, где исключение было повышено (тривиальный метод быть для установки сообщения для включения деталей вызова метода).
Вы хотели бы смотреть на обогащение исключения как на технику для улучшения обработки исключений http://tutorials.jenkov.com/java-exception-handling/exception-enrichment.html