Skip to content

Instantly share code, notes, and snippets.

@manofi21
Last active August 5, 2020 05:13
Show Gist options
  • Save manofi21/1062a1b863d0ac182240e95343c87633 to your computer and use it in GitHub Desktop.
Save manofi21/1062a1b863d0ac182240e95343c87633 to your computer and use it in GitHub Desktop.
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'method.dart';
import 'getterSetter.dart';
import 'widget.dart';
// stateless ini akan menjadi widget model. Widget model ini akan berisi List TextField dinamis //
// List TextFielld akan menyesuaikan dengan banyak panjang list String atau Function(String). //
// panjang LIst<String> dan List<Function(String)> harus sama//
class WidgetEditGist extends StatelessWidget {
final List<String> gistOpened;
final GlobalKey<FormState> keys;
final List<Function(String)> function;
const WidgetEditGist({this.gistOpened, this.keys, this.function});
@override
Widget build(BuildContext context) {
// keys di butuhkan, karena dapat menyimpan value dari Function(String) dengan method => keys.currentState.save() //
// alasan kenapa Function(String) tidak di generete di Widget ini, karena sistem akan tetap membacanya 1 Function //
return Form(
key: keys,
child: Container(
padding: EdgeInsets.all(12),
child: Center(
// textField akan dibuat dengan bantuan ListView.builder //
child: ListView.builder(
itemCount: gistOpened.length,
itemBuilder: (context, index) {
return textFormFields(
initialValue: gistOpened[index], onSaved: function[index]);
}),
),
),
);
}
}
class WidgetBaru extends StatelessWidget {
// deklarasi 2 key dan getterSetter . Key pertama untuk mengambil / merubah banyaknya List TextField //
// dari nilai yang dimasukkan oleh user dari showDialog //
final GlobalKey keys = new GlobalKey<FormState>();
// getterSetter yang akan menjadi Function(String) untuk mengambil nilainya//
final GetASet singleaset = GetASet();
// key ke-2 yang akan di taruh di model widget //
final GlobalKey keys2 = new GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
WidgetShowForm showForm = WidgetShowForm(keys2, singleaset, context);
return ChangeNotifierProvider<ProviderForTextField>(
create: (context) => ProviderForTextField(),
child: Scaffold(
appBar: AppBar(),
floatingActionButton: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 2 button di pasang mendatar. Button pertama yang akan melakukan showDialog dan snakbar //
buttonPrintTextFieldValues(keys),
// showDialog yang mengambil nilai yang dimasukkan user untuk mengubah banyak textField //
showForm.showForm()
],
),
// mengambil / memanggil nilai dari provider, yaitu List<String> dan List<Function(String)> //
// alasan generate Function(String) bukan dari provider, karena ketika di masukkan ke model widget tidak valid //
body: Consumer<ProviderForTextField>(
builder: (context, crud, _) => WidgetEditGist(
gistOpened: crud.listFieldProvider,
keys: keys,
function: crud.listFunctionProvider
.map((e) => Valid(e).saver)
.toList(),
),
)));
}
}
// kelas Function(String) . Kelas ini membutuhkan Getter Setter //
class Valid {
GetASet parts;
Valid(this.parts);
Function saver(String auto) {
parts.str_name = auto;
}
}
// kelas getterSetter //
class GetASet {
String str;
String get str_name {
return str;
}
void set str_name(String name) {
this.str = name;
}
}
import 'package:flutter/material.dart';
import 'getterSetter.dart';
// method untuk ChangeNotifier dan Provider //
class ProviderForTextField with ChangeNotifier {
// index untuk berapa banyak List<String> dan List<GetAset> yang di generate //
int countTextField = 0;
// deklarasi nilai inisialisasi yang akan di panggil di widget model //
List<String> listField = [""];
List<GetASet> listFunction = [GetASet()];
// get untuk dapat di paggil nilai //
List<GetASet> get listFunctionProvider => listFunction;
List<String> get listFieldProvider => listField;
int get countTextFieldProvider => countTextField;
// set untuk mengubah nilai dan langsung meng-generate List<String> dan LIst<Function(String)> //
set countTextFieldProvider(int index) {
countTextField = index;
listField = List<String>.generate(index, (int index) => "");
listFunction = listField.map((e) => GetASet()).toList();
notifyListeners();
}
// mengambil string dan menyatukannya dari List<Function(String)> //
String get listToString {
List<String> string = listFunction.map((e) => e.str_name).toList();
return string.reduce((value, element) => value + ' ' + element);
}
// add snakbar dari listToString //
SnackBar get snakbar => SnackBar(content: Text(listToString));
}

yang di butuhkan di list dynamic provider

  1. class GetterSetter

  2. class Valid Function(String) dengan parameter getterSetter

  3. keys (untuk get length list textfield dan get user's input)

  4. provider (jangan lupa deklarasi List = [""] dan List<Function(String)> = [GetterSetter])

import 'getterSetter.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'method.dart';
// button untuk menampilkan semua text dari textformfield //
Widget buttonPrintTextFieldValues(GlobalKey<FormState> keys) {
return Consumer<ProviderForTextField>(
builder: (context, crud, _) => FloatingActionButton(
heroTag: 'update gist',
child: Icon(Icons.update),
onPressed: () {
// menyimpan semua value dari textField //
keys.currentState.save();
crud.listFunctionProvider.forEach((element) {
print(element.str_name);
});
// get snackbar dari provider dan tampilkan //
ScaffoldFeatureController<SnackBar, SnackBarClosedReason> snackbar =
Scaffold.of(context).showSnackBar(crud.snakbar);
// menampilkan show dialog //
justDialog(crud.listToString, context, snackbar);
}),
);
}
// widget textformfield atau textfield //
Widget textFormFields({String initialValue, Function onSaved}) {
return Padding(
padding: EdgeInsets.only(bottom: 8),
child: new TextFormField(
initialValue: initialValue,
onSaved: onSaved,
decoration: InputDecoration(border: OutlineInputBorder()),
),
);
}
// kelas yang beri widget yang memanggil dialog //
class WidgetShowForm {
final GlobalKey<FormState> keys;
final GetASet getter;
final BuildContext context;
WidgetShowForm(this.keys, this.getter, this.context);
// show dialog untuk input user berapa banyak textfield yang akan di masukkan //
// parameter widget untuk button yang akan mengubah banyak List TextField //
void modalDialogItem(Widget widgets) {
// need context //
AlertDialog alerts = AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0),
),
titlePadding: EdgeInsets.zero,
content: Container(
height: MediaQuery.of(context).size.height / 3,
width: MediaQuery.of(context).size.width,
child: Column(
children: [
Form(
key: keys,
child: textFormFields(
initialValue: "1",
onSaved: Valid(getter).saver,
)),
widgets
],
)));
showDialog(context: context, builder: (BuildContext context) => alerts);
}
// button yang memunculkan dialog "modalDialogItem" . Karena showDialog adalah void, maka harus dipanggil dalam button, //
// contohnya. Dan karena "modalDialogItem" membutuhkan button, buttonUpdateTextFieldCount ditambah ke parameter mehtod. //
// buttonUpdateTextFieldCount akan mengganti banyak LIst<TextField>. Dengan bantuan keys.currentState.save(), nilai dari //
// Function(String) akan di simpan di getterSetter //
Widget showForm() {
return Consumer<ProviderForTextField>(
builder: (context, crud, _) => FloatingActionButton(
onPressed: () => modalDialogItem(buttonUpdateTextFieldCount(() {
// need keys //
keys.currentState.save();
// need getter setter //
print(getter.str_name);
crud.countTextFieldProvider = int.parse(getter.str_name);
})),
child: Icon(Icons.add),
));
}
// button yang membutuhkan VoidCallBack //
Widget buttonUpdateTextFieldCount(VoidCallback voidCallback) {
return FloatingActionButton(
heroTag: 'update gist',
child: Icon(Icons.print),
onPressed: voidCallback);
}
}
// menampilkan semua hasi imput user di textfield //
void justDialog(String stringToShow, BuildContext context,
ScaffoldFeatureController<SnackBar, SnackBarClosedReason> snackbar) {
// need context //
AlertDialog alerts = AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12.0),
),
titlePadding: EdgeInsets.zero,
content: Container(
height: MediaQuery.of(context).size.height / 3,
width: MediaQuery.of(context).size.width,
child: Column(
children: [
// menampilkan string //
Center(child: Text(stringToShow)),
FlatButton(
onPressed: () {
Navigator.pop(context);
// menutup snakbar setelah 4 detik dialog di tutup //
Future.delayed(Duration(seconds: 4), () {
snackbar.close();
});
},
child: Icon(Icons.close))
],
)));
showDialog(context: context, builder: (BuildContext context) => alerts);
}
@manofi21
Copy link
Author

manofi21 commented Aug 5, 2020

Jangan lupa tambah plugin provider

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment