使用Fluo Dio和Providers用图像更新对象的实际方法是什么?

问题描述

我正在尝试更新博客文章的标题,内容和图像。我正在使用Dio进行API请求。

问题是,如果我尝试仅更新文本字段(例如标题),而内容文本则无法完美运行。但是,如果我尝试同时更新标题,内容和图像,那么将忽略标题或内容文本。

发出api请求以Dio和提供者的程序包更新带有图像文件的对象的实际方法是什么?

我的代码示例为:

表单代码:

import tkinter as tk
from tkinter import font as tkFont

root = tk.Tk()

helv35 = tkFont.Font(family='Helvetica',size=36)
optionsList = 'eggs spam toast'.split()
selectedOption = tk.StringVar(root,value=optionsList[0])

chooseTest = tk.OptionMenu(root,selectedOption,*optionsList)
chooseTest.config(font=helv35) # set the button font

helv20 = tkFont.Font(family='Helvetica',size=20)
menu = root.nametowidget(chooseTest.menuname)
menu.config(font=helv20)  # Set the dropdown menu's font
chooseTest.grid(row=0,column=0,sticky='nsew')

root.mainloop()

提供商代码:


class _BlogPostCreateViewState extends State<BlogPostCreateView> {
  bool _isUpdating = false;
  BlogPost _blogPost = BlogPost();
  String _imageUrl;
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  TextEditingController _titleCtrl = TextEditingController();
  TextEditingController _contentCtrl = TextEditingController();

  final picker = ImagePicker();

  File _image;

  void _getImage() async {
    final pickedFile = await picker.getImage(source: ImageSource.gallery);
    setState(() {
      _image = File(pickedFile.path);
    });
  }

  @override
  Widget build(BuildContext context) {
    ScreenArguments _arguments = ModalRoute.of(context).settings.arguments;
    if (_arguments != null) {
      _blogPost = Provider.of<ForumProvider>(context).getBlogPostDetail;
      _titleCtrl.text = _blogPost.title;
      _contentCtrl.text = _blogPost.content;
      _imageUrl = _blogPost.contentImage;
      _isUpdating = true;
    }
    return Scaffold(
      appBar: AppBar(
        elevation: 10,title: Text('Share Thought'),centerTitle: true,),body: SingleChildScrollView(
        child: Container(
          margin: EdgeInsets.symmetric(horizontal: 10.0,vertical: 50.0),child: Form(
            key: _formKey,child: Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,children: <Widget>[
                TextFormField(
                  controller: _titleCtrl,autofocus: true,decoration: InputDecoration(
                    labelText: '* Blog Title',validator: (value) {
                    if (value.isEmpty) {
                      return 'Blog Title is Required';
                    } else if (value.length > 100) {
                      return 'Title must be within 100 character';
                    }
                  },onSaved: (value) {
                    _blogPost.title = value;
                  },SizedBox(height: 20.0),TextFormField(
                  controller: _contentCtrl,keyboardType: TextInputType.multiline,maxLines: null,decoration: InputDecoration(
                    hintText: '(Post)',validator: (value) {
                    if (value.length > 600) {
                      return 'Content must be within 600 characters';
                    }
                    if (_blogPost.content == null && _image == null) {
                      return 'Blog content or Image is Required';
                    }
                  },onSaved: (value) {
                    _blogPost.content = value;
                  },Column(
                  children: [
                    SizedBox(height: 10.0),_image == null
                        ? RaisedButton.icon(
                            onPressed: _getImage,icon: Icon(
                              Icons.image,color: Colors.white,label: Text(
                              _imageUrl == null
                                  ? 'Attach Image'
                                  : 'Change Image',style: xAppBardTitle.copyWith(
                                color: Colors.white,fontSize: 18.0,color: Colors.teal.shade600,)
                        : RaisedButton.icon(
                            onPressed: () {
                              setState(() {
                                _image = null;
                              });
                            },icon: Icon(
                              Icons.cancel,label: Text(
                              _imageUrl == null
                                  ? 'Remove Image'
                                  : 'Keep Previous',color: Colors.orange.shade500,SizedBox(height: 10.0),_isUpdating == false
                        ? _image == null
                            ? Container(
                                alignment: Alignment.center,child: Icon(Icons.image,size: 100,color: Colors.grey.shade300),)
                            : Center(
                                child: Image(
                                  image: FileImage(_image),)
                        : _image == null && _imageUrl == null
                            ? Container(
                                alignment: Alignment.center,)
                            : _image == null
                                ? Center(
                                    child: Image(
                                      image:
                                          NetworkImage(_blogPost.contentImage),)
                                : Center(
                                    child: Image(
                                      image: FileImage(_image),],SizedBox(height: 50.0),Consumer<ForumProvider>(
                  builder: (_,providerFunction,__) {
                    return ReUseableRoundedButton(
                      buttonText: _isUpdating == true ? 'Update' : 'Submit',onPressed: () async {
                        bool result;

                        if (!_formKey.currentState.validate()) {
                          return;
                        }
                        _formKey.currentState.save();
                        if (_isUpdating == false) {
                          result = await providerFunction.createABlogPost(
                            _blogPost,_image,);
                        } else {
                          result = await providerFunction.updateBlogPost(
                            _blogPost,);
                        }
                        if (result == true) {
                          setState(() {
                            _image = null;
                          });
                        }
                        Fluttertoast.showToast(
                          msg: result == true ? 'Success' : 'Failed',toastLength: Toast.LENGTH_SHORT,gravity: ToastGravity.BOTTOM,timeInSecForIosWeb: 2,backgroundColor: result == true
                              ? Colors.green.shade700
                              : Colors.red.shade700,textColor: Colors.white,fontSize: 16.0,);
                        providerFunction.fetchAllBlogs();
                        Navigator.pop(
                          context,BlogListView.viewName,);
                      },);
                  },)
              ],);
  }
}

API请求:

  Future<bool> updateBlogPost(BlogPost blogPost,File image) async {
    try {
      var response = await ForumApiService().updateBlogPost(
        blogPost: blogPost,image: image,);
      var post = BlogPost.fromJson(response.data);
      _setBlogDetail(post);
      _blogListUpdate(post);
      return true;
    } catch (e) {
      _setMessage('Could not Update Blog post because of $e');
      print(e);
      return false;
    }
  }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...