import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_sms/flutter_sms.dart'; void main() => runApp(MyApp()); class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State { late TextEditingController _controllerPeople, _controllerMessage; String? _message, body; String _canSendSMSMessage = 'Check is not run.'; List people = []; bool sendDirect = false; @override void initState() { super.initState(); initPlatformState(); } Future initPlatformState() async { _controllerPeople = TextEditingController(); _controllerMessage = TextEditingController(); } Future _sendSMS(List recipients) async { try { String _result = await sendSMS( message: _controllerMessage.text, recipients: recipients, sendDirect: sendDirect, ); setState(() => _message = _result); } catch (error) { setState(() => _message = error.toString()); } } Future _canSendSMS() async { bool _result = await canSendSMS(); setState(() => _canSendSMSMessage = _result ? 'This unit can send SMS' : 'This unit cannot send SMS'); return _result; } Widget _phoneTile(String name) { return Padding( padding: const EdgeInsets.all(3), child: Container( decoration: BoxDecoration( border: Border( bottom: BorderSide(color: Colors.grey.shade300), top: BorderSide(color: Colors.grey.shade300), left: BorderSide(color: Colors.grey.shade300), right: BorderSide(color: Colors.grey.shade300), )), child: Padding( padding: const EdgeInsets.all(4), child: Column( mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ IconButton( icon: const Icon(Icons.close), onPressed: () => setState(() => people.remove(name)), ), Padding( padding: const EdgeInsets.all(0), child: Text( name, textScaleFactor: 1, style: const TextStyle(fontSize: 12), ), ) ], ), )), ); } @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, home: Scaffold( appBar: AppBar( title: const Text('SMS/MMS Example'), ), body: ListView( children: [ if (people.isEmpty) const SizedBox(height: 0) else SizedBox( height: 90, child: Padding( padding: const EdgeInsets.all(3), child: ListView( scrollDirection: Axis.horizontal, children: List.generate(people.length, (int index) { return _phoneTile(people[index]); }), ), ), ), ListTile( leading: const Icon(Icons.people), title: TextField( controller: _controllerPeople, decoration: const InputDecoration(labelText: 'Add Phone Number'), keyboardType: TextInputType.number, onChanged: (String value) => setState(() {}), ), trailing: IconButton( icon: const Icon(Icons.add), onPressed: _controllerPeople.text.isEmpty ? null : () => setState(() { people.add(_controllerPeople.text.toString()); _controllerPeople.clear(); }), ), ), const Divider(), ListTile( leading: const Icon(Icons.message), title: TextField( decoration: const InputDecoration(labelText: 'Add Message'), controller: _controllerMessage, onChanged: (String value) => setState(() {}), ), ), const Divider(), ListTile( title: const Text('Can send SMS'), subtitle: Text(_canSendSMSMessage), trailing: IconButton( padding: const EdgeInsets.symmetric(vertical: 16), icon: const Icon(Icons.check), onPressed: () { _canSendSMS(); }, ), ), SwitchListTile( title: const Text('Send Direct'), subtitle: const Text('Should we skip the additional dialog?'), value: sendDirect, onChanged: (bool newValue) { setState(() { sendDirect = newValue; }); }), Padding( padding: const EdgeInsets.all(8), child: ElevatedButton( style: ButtonStyle( backgroundColor: MaterialStateProperty.resolveWith( (states) => Theme.of(context).colorScheme.secondary), padding: MaterialStateProperty.resolveWith( (states) => const EdgeInsets.symmetric(vertical: 16)), ), onPressed: () { _send(); }, child: Text( 'SEND', style: Theme.of(context).textTheme.displayMedium, ), ), ), Visibility( visible: _message != null, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: Padding( padding: const EdgeInsets.all(12), child: Text( _message ?? 'No Data', maxLines: null, ), ), ), ], ), ), ], ), ), ); } void _send() { if (people.isEmpty) { setState(() => _message = 'At Least 1 Person or Message Required'); } else { _sendSMS(people); } } }