Using other class functions on Flutter

Viewed 45

I want to know how to send data to another class.

Imported from gRPC data,List convert to String and send HomePage Class

Finally, I want to express the data that was imported in a chat message.

I copied it from YouTube, so I don't have enough code.

class Client{

  var ro;
  var de = Int64.parseRadix('24A16057F615', 16);
  var gw;
  List<int> da;
  
  ExProtoClient stub = ExProtoClient(
      ClientChannel('172.22.144.1', port: 5054,
          options: const ChannelOptions(
              credentials: ChannelCredentials.insecure())
      ));

  final box = new ExMessage();
  
  Future<ExMessage> sendMessage() async {
    await stub.exClientstream(box
      ..gwId = 0x51894B30
      ..route = 1835139072
      ..dataUnit = [0x01, 0x03, 0x00, 0x65, 0x00, 0x28, 0xAD, 0xDE]
      ..deviceId = de
    );
    return(box);
  }
  
  Future<ExMessage> receiveMessage() async {
    var request = ExMessage();

    await stub.exServerstream(request).listen((response) {
      if (response.dataUnit != null){
        ro = response.route;
        da = response.dataUnit;
        de = response.deviceId;
        gw = response.gwId;
        rxMtu(ro, gw, de, da);
      }
      else{
        print('wating');
      }
      });
  }
  
  void rxMtu(int gwGroup, int gwId, Int64 deviceId, List payload)
  {
    String data = payload.join('-');
    print(data);
  }
}

It's a Class to send data

I want to send variable data from rxMtu.

class HomePage extends StatefulWidget {

  @override
  HomePageState createState() => new HomePageState();

  static HomePageState of(BuildContext context) =>
      context.findAncestorStateOfType<HomePageState>();
}

class HomePageState extends State<HomePage> {
  var client = Client();

  //TextEditor
  TextEditingController _TextEditingController = TextEditingController();

  List<ChatMessage> _chats = [];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("gRPC on Flutter"),
      ),
      body: Column(
        children: [
          Expanded(
              child: ListView.builder(
                reverse: true,
                itemBuilder: (context, index){
                  return _chats[index];
                },
                itemCount: _chats.length,
              )),
          Container(
            padding: EdgeInsets.only(left: 8.0, right: 8.0),
            child: Row(
              children: [
                Expanded(
                  child: TextField(
                    controller: _TextEditingController,
                    decoration: InputDecoration(hintText: "Send Message"),
                    onSubmitted: (String text){
                      _handleSubmitted(text);
                    },
                  ),
                ),
                SizedBox(
                  width: 8.0,
                ),
                FlatButton(onPressed: (client.sendMessage)
                  , child: Text("Send"), color: Colors.greenAccent,),
              ],
            ),
          ),
        ],
      ),
    );
  }

  void _handleSubmitted(String text){
    Logger().d(text);
    _TextEditingController.clear();
    ChatMessage newChat = ChatMessage(text);
    setState(() {
      _chats.insert(0, newChat);
    });
  }
}

It's Class to receive data

I want to send the data to _handleSubmitted function

class ChatMessage extends StatelessWidget {
  final String txt;
  const ChatMessage(this.txt,{Key key,}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8),
      child: Row(children: [
        CircleAvatar(
          backgroundColor: Colors.blueGrey,
          child: Text("Data"),
        ),
        SizedBox(width: 16,),
        Expanded(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text(
                  "Payload",
                  style: TextStyle(fontWeight:FontWeight.bold ),
                ),
                Text(txt),
              ],
            )
        )
      ],
      ),
    );
  }
}

this is chatMessage Class

Thank you for reading it.

1 Answers

I am not sure about your problem, but if you need a class that shares data and methods with other classes or widgets, you need to use state management, for example, provider, Bloc or etc. I suggest to use provider as follow:

  1. first add it to you pubspec.yaml file (dependency section)
  provider: ^4.0.1
  1. create your class
class MessageModel extends ChangeNotifier {
   // define your variables and methods
}
  1. add the provider to your main page
void main() {
  runApp(
    ChangeNotifierProvider(
      create: (context) => MessageModel(),
      child: MyApp(),
    ),
  );
}
  1. use each method or variable, everwhere you want
Provider.of<MessageModel>(context, listen: false).NamOfYourMehto();

I hope it could be helpful.

Related