Xamarin.forms 中的导航:缓冲区空

Navigation in Xamarin.forms: buffer null

在 Xamarin.Forms 应用程序中,我在 PagePage_1)上有一个按钮,可以将我发送到另一个 Page (Page_2) 与语句

await Navigation.PushAsync (new Page_2 ());

在这个 Page 上,我有几个 ImageButton,当点击声明

await Navigation.PopAsync ();

这第一次有效,但我第二次按下 Page_1 上的按钮时,我转到 Page_2,然后当我单击 ImageButton 时,应用程序退出并显示错误消息:

System.ArgumentNullException Message = Buffer cannot be null. Parameter name: buffer

如何让 Navigation.NavigationStack 仍然包含 Page_1

非常感谢您的帮助。

为 Deczaloth 添加:这是第一页的部分代码:

private async void btnModifImage_Clicked(object sender, EventArgs e)
    {
        string imgLocation;
        // affichage et choix : gallerie ou internet
        imgLocation = await DisplayActionSheet("Emplacement", "Annuler", null, imageLocation);
        if (imgLocation == "Gallerie")
        {
            // chargement image depuis gallerie
            imageChanged = true;
            article_nomcat = pickerCat.Title;
            article_unit = pickerUnit.Title;
            try
            {
                FileData fileData = await CrossFilePicker.Current.PickFile();
                //
                var filepath = fileData.FilePath;
                //
                if (fileData == null)
                    return; // user canceled file picking

                newimageByte = fileData.DataArray;
                resizedImageByte = await ImageResizer.ResizeImage(newimageByte, 100, 100);

                if (resizedImageByte != null)
                {
                    imageChanged = true;
                    var stream1 = new MemoryStream(resizedImageByte);
                    ImageArticle.Source = ImageSource.FromStream(() => stream1);
                }
            }
            catch (Exception ex)
            {
                imageChanged = false;
            }
        }
        else
        {
            App.ImageName = name.Text;
            await Navigation.PushAsync(new ImageBingPage());
        }
    }

和第二页ImageBingPage部分代码:

private async void img1_Clicked(object sender, EventArgs e)
    {
        byte[] img1Byte = await DownloadImageAsync(img1Path);
        App.imgByte = img3Byte;
        await Navigation.PopAsync();
    }

和第二页的biginning :

protected override void OnAppearing()
    {
        base.OnAppearing();
        SearchImage();
        base.OnDisappearing();
    }

    public void SearchImage()
    {
        
        List<Images> imageList = new List<Images>();
        SearchResult bingResult = BingImageSearch(App.ImageName);
        var res = JsonConvert.DeserializeObject<ResponseModel>(bingResult.jsonResult);
        for (int i = 0; i < res.value.Count; i++)
        {
            imageList.Add(new Images { ImagePath = res.value[i].contentUrl });
        }
        img1.Source = ImageSource.FromUri(new Uri(imageList[0].ImagePath));
        img1Path = imageList[0].ImagePath;
        img2.Source = ImageSource.FromUri(new Uri(imageList[1].ImagePath));
        img2Path = imageList[1].ImagePath;
        img3.Source = ImageSource.FromUri(new Uri(imageList[2].ImagePath));
        img3Path = imageList[2].ImagePath;
    }

    static SearchResult BingImageSearch(string searchQuery)
    {
        var uriQuery = baseURl + "?q=" + Uri.EscapeDataString(searchQuery);
        WebRequest request = HttpWebRequest.Create(uriQuery);
        request.Headers["Ocp-Apim-Subscription-Key"] = APIKey;
        HttpWebResponse response = (HttpWebResponse)request.GetResponseAsync().Result;
        string json = new StreamReader(response.GetResponseStream()).ReadToEnd();
        var searchResult = new SearchResult();
        searchResult.jsonResult = json;
        searchResult.relevantHeaders = new Dictionary<String, String>();
        foreach (String header in response.Headers)
        {
            if (header.StartsWith("BingAPIs-") || header.StartsWith("X-MSEdge-"))
                searchResult.relevantHeaders[header] = response.Headers[header];
        }
        return searchResult;
    }


    async Task<byte[]> DownloadImageAsync(string imageUrl)
    {
        try
        {
            using (var httpResponse = await _httpClient.GetAsync(imageUrl))
            {
                if (httpResponse.StatusCode == HttpStatusCode.OK)
                {
                    return await httpResponse.Content.ReadAsByteArrayAsync();
                }
                else
                {
                    //Url is Invalid
                    return null;
                }
            }
        }
        catch (Exception e)
        {
            //Handle Exception
            return null;
        }
    }

为 Deczaloth 添加 2:你是对的:堆栈不为空(参见两个随附的屏幕截图)。那么问题从何而来?

为杰克编辑:我修改了我的代码以简化问题:

private async void img1_Clicked(object sender, EventArgs e)
    {
        //byte[] img1Byte = await DownloadImageAsync(imgPath[0]);
        //App.imgByte = img1Byte;
        await Navigation.PopAsync();
    }

    private async void img2_Clicked(object sender, EventArgs e)
    {
        //byte[] img2Byte = await DownloadImageAsync(imgPath[1]);
        //App.imgByte = img2Byte;
        await Navigation.PopAsync();
    }

现在我可以在 ArticleEntry 页面和 ImageBingPage 页面之间进行 3 次往返,但之后,应用程序还是崩溃了。

为 Jack 编辑:ArticleEntry 页面上有代码:

protected override async void OnAppearing()
    {
        base.OnAppearing();
        if (App.AddArticle == true)
        {
            ToolbarItems.Remove(btnDelete);
        }
        
        //
        _article = (Article)BindingContext;
        old_article_ID = _article.ID;
        old_article_name = _article.Name;
        article_nomcat = _article.NomCat;
        article_unit = _article.UniteMesure;
        //
        if (_article.ID == 0)
        {
            name.Focus();
        }
        //
        if (pickerCat.Title != null & pickerCat.Title != "choisissez une catégorie")
        {
            _article.NomCat = pickerCat.Title;
            pickerCat.TitleColor = Color.Black;
        }
        else
        {
            if (_article.NomCat != null)
            {
                pickerCat.Title = _article.NomCat;
                pickerCat.SelectedItem = _article.NomCat;
                pickerCat.TitleColor = Color.Black;
            }
            else
            {
                pickerCat.Title = "choisissez une catégorie";
                pickerCat.TitleColor = Color.Gray;
            }
            
        }
        //
        if (pickerUnit.Title != null & pickerUnit.Title != "choisissez une unité de mesure")
        {
            _article.UniteMesure = pickerUnit.Title;
            pickerUnit.TitleColor = Color.Black;
        }
        else
        {
            if (_article.UniteMesure != null)
            {
                pickerUnit.Title = _article.UniteMesure;
                pickerUnit.SelectedItem = _article.UniteMesure;
                pickerUnit.TitleColor = Color.Black;
            }
            else
            {
                pickerUnit.Title = "choisissez une unité de mesure";
                pickerUnit.TitleColor = Color.Gray;
            }
        }
        //
        if (pickerListeAchats.Title != null & pickerListeAchats.Title != "choisissez une liste d'achats")
        {
            //_article.UniteMesure = pickerUnit.Title;
            pickerListeAchats.TitleColor = Color.Black;
        }
        
        //
        ReadAllCategorieList dbcategorie = new ReadAllCategorieList();
        DB_CategorieList = dbcategorie.GetAllCategorie(); //Get all DB Categorie
        // trier  
        DB_CategorieList_Sorted = DB_CategorieList.OrderBy(i => i.NomCat).ToList();
        //
        // rempliir la liste du picker Cat
        string[] pickerListCat;
        List<string> pkListCat = new List<string>();
        foreach (var item in DB_CategorieList_Sorted)
        {
            string element = item.NomCat;
            //pickerCat.Items.Add(element);
            pkListCat.Add(element);
        }
        pickerListCat = pkListCat.ToArray();
        pickerCat.ItemsSource = pickerListCat;
        //
        // rempliir la liste du picker Unit
        ReadAllUnitList dbunit = new ReadAllUnitList();
        DB_UnitList = dbunit.GetAllUnit();
        // trier  
        DB_UnitList_Sorted = DB_UnitList.OrderBy(i => i.UniteMesure).ToList();
        //
        List<string> pickerListUnit = new List<string>();
        foreach (var item in DB_UnitList_Sorted)
        {
            string element = item.UniteMesure;
            pickerListUnit.Add(element);
        }
        pickerUnit.ItemsSource = pickerListUnit;
        //
        // remplir la liste du picker ListeAchats
        ReadAllListeAchatsList dblisteachats = new ReadAllListeAchatsList();
        DB_ListeAchatsList = dblisteachats.GetAllListeAchats();
        // trier  
        DB_ListeAchatsList_Sorted = DB_ListeAchatsList.OrderBy(i => i.NomListe).ToList();
        //
        List<string> pickerListAchat = new List<string>();
        foreach (var item in DB_ListeAchatsList_Sorted)
        {
            string element = item.NomListe;
            pickerListAchat.Add(element);
        }
        pickerListeAchats.ItemsSource = pickerListAchat;
        //
        //
        imageByte = _article.ImageArt;
        //
        // convertir le byte[] en bitmapimage (si != 0)
        if (_article.ImageArt != null)
        {
            if (imageChanged)
            {
                var stream1 = new MemoryStream(newimageByte);
                ImageArticle.Source = ImageSource.FromStream(() => stream1);
            }
            else
            {
                var stream1 = new MemoryStream(imageByte);
                ImageArticle.Source = ImageSource.FromStream(() => stream1);
            }
        }
        else
        {
            if (imageChanged == false)
            {
                imageByte = ImageDataFromResource("MemoCourses.Assets.Images.appareil_photo.png");
                var stream1 = new MemoryStream(imageByte);
                ImageArticle.Source = ImageSource.FromStream(() => stream1);
            }
        }
        //
        if (App.imgByte != null)
        {
            resizedImageByte = await ImageResizer.ResizeImage(App.imgByte, 100, 100);
            if (resizedImageByte != null)
            {
                imageChanged = true;
                var stream1 = new MemoryStream(resizedImageByte);
                ImageArticle.Source = ImageSource.FromStream(() => stream1);
            }
        }
        //
        base.OnDisappearing();
        App.AddArticle = false;
    }

代码已根据 Jack 的评论进行了更改

protected override async void OnAppearing()
    {
        base.OnAppearing();
        if (App.AddArticle == true)
        {
            ToolbarItems.Remove(btnDelete);
        }
        //
        _article = (Article)BindingContext;
        old_article_ID = _article.ID;
        old_article_name = _article.Name;
        article_nomcat = _article.NomCat;
        article_unit = _article.UniteMesure;
        //
        if (_article.ID == 0)
        {
            name.Focus();
        }
        //
        if (pickerCat.Title != null & pickerCat.Title != "choisissez une catégorie")
        {
            _article.NomCat = pickerCat.Title;
            pickerCat.TitleColor = Color.Black;
        }
        else
        {
            if (_article.NomCat != null)
            {
                pickerCat.Title = _article.NomCat;
                pickerCat.SelectedItem = _article.NomCat;
                pickerCat.TitleColor = Color.Black;
            }
            else
            {
                pickerCat.Title = "choisissez une catégorie";
                pickerCat.TitleColor = Color.Gray;
            }
            
        }
        //
        if (pickerUnit.Title != null & pickerUnit.Title != "choisissez une unité de mesure")
        {
            _article.UniteMesure = pickerUnit.Title;
            pickerUnit.TitleColor = Color.Black;
        }
        else
        {
            if (_article.UniteMesure != null)
            {
                pickerUnit.Title = _article.UniteMesure;
                pickerUnit.SelectedItem = _article.UniteMesure;
                pickerUnit.TitleColor = Color.Black;
            }
            else
            {
                pickerUnit.Title = "choisissez une unité de mesure";
                pickerUnit.TitleColor = Color.Gray;
            }
        }
        //
        if (pickerListeAchats.Title != null & pickerListeAchats.Title != "choisissez une liste d'achats")
        {
            pickerListeAchats.TitleColor = Color.Black;
        }
        
        //
        ReadAllCategorieList dbcategorie = new ReadAllCategorieList();
        DB_CategorieList = dbcategorie.GetAllCategorie(); //Get all DB Categorie
        // trier  
        DB_CategorieList_Sorted = DB_CategorieList.OrderBy(i => i.NomCat).ToList();
        //
        // rempliir la liste du picker Cat
        string[] pickerListCat;
        List<string> pkListCat = new List<string>();
        foreach (var item in DB_CategorieList_Sorted)
        {
            string element = item.NomCat;
            pkListCat.Add(element);
        }
        pickerListCat = pkListCat.ToArray();
        pickerCat.ItemsSource = pickerListCat;
        //
        // rempliir la liste du picker Unit
        ReadAllUnitList dbunit = new ReadAllUnitList();
        DB_UnitList = dbunit.GetAllUnit();
        // trier  
        DB_UnitList_Sorted = DB_UnitList.OrderBy(i => i.UniteMesure).ToList();
        //
        List<string> pickerListUnit = new List<string>();
        foreach (var item in DB_UnitList_Sorted)
        {
            string element = item.UniteMesure;
            pickerListUnit.Add(element);
        }
        pickerUnit.ItemsSource = pickerListUnit;
        //
        // remplir la liste du picker ListeAchats
        ReadAllListeAchatsList dblisteachats = new ReadAllListeAchatsList();
        DB_ListeAchatsList = dblisteachats.GetAllListeAchats();
        // trier  
        DB_ListeAchatsList_Sorted = DB_ListeAchatsList.OrderBy(i => i.NomListe).ToList();
        //
        List<string> pickerListAchat = new List<string>();
        foreach (var item in DB_ListeAchatsList_Sorted)
        {
            string element = item.NomListe;
            pickerListAchat.Add(element);
        }
        pickerListeAchats.ItemsSource = pickerListAchat;
        //
        //
        imageByte = _article.ImageArt;
        //
        // convertir le byte[] en bitmapimage (si != 0)
        if (_article.ImageArt != null)
        {
            if (imageGallery)
            {
                var stream1 = new MemoryStream(resizedImageByte);
                ImageArticle.Source = ImageSource.FromStream(() => stream1);
            }
            else
            {
                if (App.imgByte == null)
                {
                    // image depuis la base SQLite
                    var stream1 = new MemoryStream(imageByte);
                    ImageArticle.Source = ImageSource.FromStream(() => stream1);
                }
                else
                {
                    // image depuis internet
                    var stream1 = new MemoryStream(App.imgByte);
                    ImageArticle.Source = ImageSource.FromStream(() => stream1);
                }
            }
        }
        else
        {
            if (imageChanged == false)
            {
                // image par défaut
                imageByte = ImageDataFromResource("MemoCourses.Assets.Images.appareil_photo.png");
                var stream1 = new MemoryStream(imageByte);
                ImageArticle.Source = ImageSource.FromStream(() => stream1);
            }
        }
        //
        if (App.imgByte != null & imageInternet == true)
        {
            resizedImageByte = await ImageResizer.ResizeImage(App.imgByte, 100, 100);
            if (resizedImageByte != null)
            {
                var stream1 = new MemoryStream(resizedImageByte);
                ImageArticle.Source = ImageSource.FromStream(() => stream1);
            }
        }
        //
        base.OnDisappearing();
        App.AddArticle = false;
        imageGallery = false;
        imageInternet = false;
    }

问题不是由NavigationStack引起的。

1.You 不应在 OnAppearing:

中调用 base.OnDisappearing();
protected override void OnAppearing()
{
    base.OnAppearing();
    SearchImage();
    //remove this line
    //base.OnDisappearing();
}

2.You 得到一个 java.io.IOException: Cleartext HTTP traffic to aardbeienzo.com not permitted 你没有权限加载 url 从 http:

开始

转到 Android 项目 --> 属性 --> Assemblyinfo.cs,添加 UsesCleartextTraffic = true:

// Add some common permissions, these can be removed if not needed
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.WriteExternalStorage)]

[assembly: Application(UsesCleartextTraffic = true)]

更新:

private async void img1_Clicked(object sender, EventArgs e)
    {
        byte[] img1Byte = await DownloadImageAsync(img1Path);
        //App.imgByte = img3Byte;
        App.imgByte = img1Byte;
        await Navigation.PopAsync();
    }

更新二:

一般情况下,如果正确使用导航push/pop,是不会出现这个错误的。注意Page的OnAppearing方法,查看里面的代码

问题中的正确代码已由 Marcel Delhaye 更新。