Это то, что делает стековый навигатор, он хочет снова загрузить весь экран.
Он просто хранит все для вас, так что когда вы вернетесь назад, все будет там, в каком бы состоянии вы не покинули экран.
Например, вы прокрутили наполовину на определенном экране и перешли на другой экран, теперь вы вернулись, и вы увидите, что ваш экран наполовину прокручен там, где вы оставили.
так что ничего не поделаешь, когда ты вернешься.
Примечание: Если экран перемещался в прошлом и существует в текущем стеке, то переход к экрану снова не вызовет никаких методов жизненного цикла.
Итак, для вашего случая,
вы можете передать ссылку на метод в навигационные параметры. и позвоните, прежде чем начать навигацию.
вот так,
скажем, вы находитесь в screenB и хотите вызвать метод methodSuperCool=()=>{...}
, который находится в screenA
, из которого вы перешли на текущий экран.
для этого вам нужно будет передать ссылку на метод в параметрах при переходе к screenB с экрана A.
this.props.navigation.navigate('screenB',{methodSuperCool:this.methodSuperCool});
//this to be write in screenA
сейчас на экране B, прежде чем вы перейдете к экрану, вызовите это,
this.props.navigation.state.params.methodSuperCool() // this can also have params if you like to pass
this.props.navigation.navigate('screenA') // or goBack() method will also work
Вам не нужно делать это вручную. Как указывалось в других ответах, существует множество способов, встроенных или иных, для сериализации / десериализации.
Однако, если вы решили выполнить работу самостоятельно, для этого не требуется , чтобы много кода:
public static string CreateDelimitedString(IEnumerable<string> items)
{
StringBuilder sb = new StringBuilder();
foreach (string item in items)
{
sb.Append(item.Replace("\\", "\\\\").Replace(",", "\\,"));
sb.Append(",");
}
return (sb.Length > 0) ? sb.ToString(0, sb.Length - 1) : string.Empty;
}
Это разделит элементы запятой (,
). Любые существующие запятые будут экранированы обратной косой чертой ( \
), и любые существующие обратные косые черты также будут экранированы.
public static IEnumerable<string> GetItemsFromDelimitedString(string s)
{
bool escaped = false;
StringBuilder sb = new StringBuilder();
foreach (char c in s)
{
if ((c == '\\') && !escaped)
{
escaped = true;
}
else if ((c == ',') && !escaped)
{
yield return sb.ToString();
sb.Length = 0;
}
else
{
sb.Append(c);
escaped = false;
}
}
yield return sb.ToString();
}
You could use the .ToArray property on the List<> and then serialize the Array - that could then be dumped to disk or network, and reconstituted with a deserialization on the other end.
Not too much code, and you get to use the serialization techniques already tested and coded in the .net framework.
You might like to look at the way CSV files are formatted.
I don't believe there is a silver bullet solution to this problem.
Добавьте ссылку и с помощью
в System.Web, а затем:
public static string Encode(IEnumerable<string> strings)
{
return string.Join("&", strings.Select(s => HttpUtility.UrlEncode(s)).ToArray());
}
public static IEnumerable<string> Decode(string list)
{
return list.Split('&').Select(s => HttpUtility.UrlDecode(s));
}
В большинстве языков есть пара служебных функций, которые выполняют "процентное" кодирование URL, и это идеально подходит для повторного использования в подобных ситуациях.
You could use an XmlDocument to handle the serialization. That will handle the encoding for you.
public static string encode(System.Collections.Generic.List<string> data)
{
var xml = new XmlDocument();
xml.AppendChild(xml.CreateElement("data"));
foreach (var item in data)
{
var xmlItem = (XmlElement)xml.DocumentElement.AppendChild(xml.CreateElement("item"));
xmlItem.InnerText = item;
}
return xml.OuterXml;
}
public static string[] decode(string encoded)
{
var items = new System.Collections.Generic.List<string>();
var xml = new XmlDocument();
xml.LoadXml(encoded);
foreach (XmlElement xmlItem in xml.SelectNodes("/data/item"))
items.Add(xmlItem.InnerText);
return items.ToArray();
}
Here's an old-school technique that might be suitable -
Serialise by storing the width of each string[] as a fixed-width prefix in each line.
So
string[0]="abc"
string[1]="defg"
string[2]=" :::==--==::: "
becomes
0003abc0004defg0014 :::==--==:::
...where the size of the prefix is large enough to cater for the string maximum length
Я бы просто добавил к каждой строке ее длину и терминатор, указывающий конец длины.
abc defg hijk xyz 546 4.X
становится
3: abc 4: defg 4: hijk 3: xyz 3: 546 3: 4.X
Никаких ограничений или ограничений вообще и достаточно простой.
Json.NET - очень простой способ сериализации любого объекта, который вы можете себе представить. JSON сохраняет компактность и может работать быстрее, чем XML.
List<string> foo = new List<string>() { "1", "2" };
string output = JsonConvert.SerializeObject(foo);
List<string> fooToo = (List<string>)JsonConvert.DeserializeObject(output, typeof(List<string>));
Включите библиотеку System.Linq в свой файл и измените свои функции на следующие:
public static string encode(System.Collections.Generic.List<string> data, out string delimiter)
{
delimiter = ":";
while(data.Contains(delimiter)) delimiter += ":";
return string.Join(delimiter, data.ToArray());
}
public static string[] decode(string encoded, string delimiter)
{
return encoded.Split(new string[] { delimiter }, StringSplitOptions.None);
}
Why not use Xstream to serialise it, rather than reinventing your own serialisation format?
Its pretty simple:
new XStream().toXML(yourobject)
Вам не нужно делать это вручную. Как указывалось в других ответах, существует множество способов, встроенных или иных, для сериализации / десериализации.
Однако, если вы решили выполнить работу самостоятельно, для этого не требуется , что много кода:
public static string CreateDelimitedString(IEnumerable<string> items)
{
StringBuilder sb = new StringBuilder();
foreach (string item in items)
{
sb.Append(item.Replace("\\", "\\\\").Replace(",", "\\,"));
sb.Append(",");
}
return (sb.Length > 0) ? sb.ToString(0, sb.Length - 1) : string.Empty;
}
Это разделит элементы запятой (,
). Любые существующие запятые будут экранированы обратной косой чертой ( \
), и любые существующие обратные косые черты также будут экранированы.