首页 > 解决方案 > Xamarin.forms 中的导航:缓冲区空

问题描述

Page在 Xamarin.Forms 应用程序中,我在( Page_1 )上有一个按钮,该按钮将我发送到另一个Page( Page_2 ) 并带有语句

await Navigation.PushAsync (new Page_2 ());

在这一点上Page,我有几个ImageButtons在单击该语句时都将我返回到Page_1

await Navigation.PopAsync ();

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

System.ArgumentNullException 消息 = 缓冲区不能为空。参数名称:缓冲区

我怎样才能使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 :您是对的:堆栈不为空(请参见随附的两个屏幕截图)。那么问题出在哪里呢? 第一关 第二次

为 Jack 编辑:我修改了代码以简化问题:

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;
    }

标签: xamarin.formsnavigation

解决方案


问题不是由NavigationStack.

1.你不应该base.OnDisappearing();打电话OnAppearing

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

2.你得到一个java.io.IOException: Cleartext HTTP traffic to aardbeienzo.com not permitted你无权加载以http开头的url:

转到 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();
    }

更新 2:

一般来说,如果你正确使用 Navigation push/pop,是不会报错的。注意 Page 的 OnAppearing 方法并检查那里的代码。

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


推荐阅读