Флаттер возвращает сообщение после успешного вызова API - PullRequest
0 голосов
/ 21 марта 2020

Здравствуйте, я новичок в трепетании, и я решил создать приложение TodoList, чтобы оттачивать свои навыки и привыкать к трепетанию и работе с API

, что я пытаюсь сделать - это то, что я хочу показать сообщение, написанное на нашем языке, после отправки данных в API

код

Future<Todo> sendData(String title, String body) async{
  final http.Response response = await http.post(
    'http://192.168.1.20/Todo_api/public/todos/store',
    headers: <String , String>{
      'Content-Type' : 'application/json; charset=UTF-8',
    },
    body: jsonEncode(<String,String>{
      'title' : title,
      'body' : body,
    }),
  );
  if(response.statusCode == 200){
    //200 Created
    //parse json
    return Todo.fromJson(jsonDecode(response.body)) ;
  }else{
    throw Exception('Failed to submit Contact the Devolopers please ');
  }
}

, как вы можете видеть, я хочу показать сообщение для пользователя, если код 200 (успех) вместо синтаксического анализа ответа json для пользователя, потому что он не получит его, а также я хочу вызвать Navigator.pop (), чтобы пользователь мог go вернуться к главному экрану, который я попытался вернуть, widget, string, ... et c, но он не работал и продолжал выдавать эту ошибку

error: значение типа 'Null Function () не может быть возвращено из функции' sendData ', потому что он имеет тип возвращаемого значения' Future '. (return_of_invalid_type at [todolist] lib \ CreateTodo.dart: 35)

, так что я хочу сделать, как упоминалось ранее, я хочу go вернуться на главный экран и показать дружеское сообщение для пользователь как в laravel

return redirect("/")->with('success' , 'Todo Stored Successfully');

и это все Спасибо за просмотр моего поста и Заранее спасибо

ОБНОВЛЕНИЕ: Решено с помощью оператора if для моих переменных

полный код

import 'dart:convert';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:rflutter_alert/rflutter_alert.dart';
import 'main.dart';
class Todo {
  final title;
  final body;
  Todo ({this.title , this.body});

  factory Todo.fromJson(Map<String , dynamic> json){
    return Todo(
      title: json['title'],
      body: json['body'],

    );
  }
}

Future<Todo> sendData(String title, String body) async{
  final http.Response response = await http.post(
    'http://192.168.1.20/Todo_api/public/todos/store',
    headers: <String , String>{
      'Content-Type' : 'application/json; charset=UTF-8',
    },
    body: jsonEncode(<String,String>{
      'title' : title,
      'body' : body,
    }),
  );
  if(response.statusCode == 201){
    return Todo.fromJson(jsonDecode(response.body));
  }else{
    return null;
  }
}



class CreateTodo extends StatefulWidget {
  @override
  _CreateTodoState createState() => _CreateTodoState();
}

class _CreateTodoState extends State<CreateTodo> {
  Future<Todo> _futureTodo;

  String title = "";

  String body = "";

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Create Todo"),
      ),
      body: Center(
        child : ListView(
          children: <Widget>[
               Padding(
                padding: const EdgeInsets.all(8.0),
                child: TextField(
                  onChanged: (text){
                    title = text;
                  },
                  decoration: InputDecoration(hintText: 'Enter Title'),
                ),
              ),
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextField(
                onChanged: (text){
                  body = text;
                },
                decoration: InputDecoration(hintText: 'Enter Body'),
              ),
            ),
            IconButton(
              icon: Icon(Icons.send),
                //if contains data then send else block
                onPressed: () {
                    if (title == '' || body == ''){
                      Alert(context: context, title: "Error", desc: "Please fill the form", type: AlertType.error).show();
                    }else{
                      _futureTodo = sendData(title,body);
                      Alert(context: context, title: "Success", desc: "Stored Successfully", type: AlertType.success,
                          buttons: [
                            DialogButton(
                              child: Text(
                                "Home",
                                style: TextStyle(color: Colors.white, fontSize: 20),
                              ),
                              onPressed: (){
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(builder: (context) => MyApp()),
                                );
                              },
                              width: 120,
                            ),
                            DialogButton(
                              child: Text(
                                "Back",
                                style: TextStyle(color: Colors.white, fontSize: 20),
                              ),
                              onPressed: (){
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(builder: (context) => CreateTodo()),
                                );
                                },
                            ),
                          ]
                      ).show();
                    }
                },
            ),
          ],
        ),
      ),
    );
  }
}

1 Ответ

0 голосов
/ 21 марта 2020

Это должно помочь вам

class Api extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      floatingActionButton: Builder(
        builder: (context){
          return FloatingActionButton(
            onPressed: (){
              sendData("default", "default").then((value){
                Scaffold.of(context).showSnackBar(SnackBar(content: Text("Welcome"),))
              });
            },
          );
        },
      ),
    );
  }

  Future<bool> sendData(String title, String body) async{
    final http.Response response = await http.post(
      'http://192.168.1.20/Todo_api/public/todos/store',
      headers: <String , String>{
        'Content-Type' : 'application/json; charset=UTF-8',
      },
      body: jsonEncode(<String,String>{
        'title' : title,
        'body' : body,
      }),
    );
    if(response.statusCode == 200){
      //200 Created
      //parse json
      return true;
    }else{
      throw Exception('Failed to submit Contact the Devolopers please ');
    }
  }
}
...