vishnu
vishnu

Reputation: 4599

Flutter setState() not updating the view after Invoking Flutter Code From Native Side

I am trying to implement invoking Flutter Code From Native Side using method channel and working as expected. But having issue with rendering the view after trying to set the state. Can any one help to fix the issue?

Actually the SimSlotInfo is calling from the below widget,

List<Step> getSteps() {
    return <Step>[
      Step(
        state: currentStep > 0 ? StepState.complete : StepState.indexed,
        isActive: currentStep >= 0,
        title: const Text("Send SMS"),
        content: Column(
          children:  [
            SimSlotInfo()
          ],
        ),
      ),
    ];
  }

SimSlotInfo dart class

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutterdemo/model/device_slot.dart';


class SimSlotInfo extends StatefulWidget {
  //callback function
  final void Function(String) callBackFunction;
  const SimSlotInfo(this.callBackFunction, {super.key});

  //const SimSlotInfo({Key? key}) : super(key: key);
  @override
  State<SimSlotInfo> createState() => _SimSlotInfoState();
}

class _SimSlotInfoState extends State<SimSlotInfo> {
  final platformMethodChannel = const MethodChannel('common_lib_plugin');
  List<SimDetails> simDetailsObj = [];
  //execute the below code while page loading
  @override
  void initState() {
    super.initState();
    platformMethodChannel.setMethodCallHandler(handleNativeMethodCall);
  }

  Future<void> handleNativeMethodCall(MethodCall call)  async {
    // do some processing
    switch(call.method) {
      case "deviceInfo":
        var simData = call.arguments;

        var arrayObjsText = '[{"slot":0,"simno":"89911017061","deviceid":"3518920","carrierName":"Vodafone"},{"slot":1,"simno":"89101706","deviceid":"3511643","carrierName":"JIO"}]';
        List simObjsJson = jsonDecode(arrayObjsText) as List;
        simDetailsObj = simObjsJson.map((tagJson) => SimDetails.fromJson(tagJson)).toList();
        setState(()  {
          simDetailsObj = simDetailsObj;
        });

    }
  }


  @override
  Widget build(BuildContext context) {
    return Column(
        children:
        simDetailsObj.map((data) => RadioListTile(
          dense: true,
          contentPadding: EdgeInsets.zero,
          title: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Text(
                "${data.carrierName}",
                style: const TextStyle(color: Colors.black, fontSize: 18),
              ),
            ],
          ),
          groupValue: _selectedSim,
          value: data.simno,
          onChanged: (val) {
        
          },
        )).toList()

    );
  }
  }
  

Upvotes: 0

Views: 91

Answers (1)

Harsimran Singh
Harsimran Singh

Reputation: 359

First, you are trying to assign List to List so your code is getting brake there. to solve that loop the object with SimDetails object. and that will do the trick


ParentWidget

class _ParentWidgetState extends State<ParentWidget> {
  @override
  Widget build(BuildContext context) {
    return ChildWidget(  // <---- child widget
      callSetState: (list) { // <--- callback Function 
        print(list);
        setState(() {
          // <---  
        });
      },
    );
  }
}

In Child widget

class ChildWidget extends StatefulWidget {
  const ChildWidget({Key? key, required this.callSetState}) : super(key: key);

  final Function(List<SimDetails>) callSetState; // <-- declare callback function here 

  @override
  State<ChildWidget> createState() => _ChildWidgetState();
}

and replace your setState with widget.callSetState

  Future<void> handleNativeMethodCall(MethodCall methodCall) async {
switch (call.method) {
  case 'deviceInfo':
    var simData = call.arguments;
    var arrayObjsText =
        '[{"slot":0,"simno":"89911017061","deviceid":"3518920","carrierName":"Vodafone"},{"slot":1,"simno":"89101706","deviceid":"3511643","carrierName":"JIO"}]';
    for (var data in jsonDecode(arrayObjsText)) {
      simDetailsObj.add(
        SimDetails(
          slot: data['slot'],
          simno: data['simno'],
          deviceid: data['deviceid'],
          carrierName: data['carrierName'],
        ),
      );
    }
    /// setState(() {});
    widget.callSetState(simDetailsObj);
   
  break;
  default:
}}

Upvotes: 1

Related Questions