আপনার ইস্যুতে আমার এই পদ্ধতিটি এখানে। এটি এখানেhttp
হিসাবে প্যাকেজ থেকে বাস্তবায়ন উপর ভিত্তি করে ।
মূল ধারণাটি নিম্নরূপ।
- আপনার যে পদ্ধতিগুলি ব্যবহার করতে হবে তা নির্ধারণ করতে একটি বিমূর্ত শ্রেণি তৈরি করুন Create
- নির্দিষ্টকরণ
web
এবং android
নির্ভরতাগুলি তৈরি করুন যা এই বিমূর্ত শ্রেণিকে প্রসারিত করে।
- এই স্ট্যাব তৈরি করুন যা এই বিমূর্ত বাস্তবায়নের উদাহরণটি ফেরত দেওয়ার জন্য কোনও পদ্ধতি প্রকাশ করে। এটি কেবল ডার্ট বিশ্লেষণের সরঞ্জামকে খুশি রাখার জন্য।
- বিমূর্ত শ্রেণিতে শর্তসাপেক্ষে আমদানি নির্দিষ্ট
mobile
এবং এর সাথে এই স্টাব ফাইলটি আমদানি করুন web
। তারপরে কারখানায় নির্ধারক নির্দিষ্ট প্রয়োগের উদাহরণটি ফিরিয়ে দিন। এটি সঠিকভাবে লিখিত হলে শর্তাধীন আমদানি দ্বারা স্বয়ংক্রিয়ভাবে পরিচালিত হবে।
পদক্ষেপ -1 এবং 4:
import 'key_finder_stub.dart'
// ignore: uri_does_not_exist
if (dart.library.io) 'package:flutter_conditional_dependencies_example/storage/shared_pref_key_finder.dart'
// ignore: uri_does_not_exist
if (dart.library.html) 'package:flutter_conditional_dependencies_example/storage/web_key_finder.dart';
abstract class KeyFinder {
// some generic methods to be exposed.
/// returns a value based on the key
String getKeyValue(String key) {
return "I am from the interface";
}
/// stores a key value pair in the respective storage.
void setKeyValue(String key, String value) {}
/// factory constructor to return the correct implementation.
factory KeyFinder() => getKeyFinder();
}
পদক্ষেপ -২.১: ওয়েব কী সন্ধানকারী
import 'dart:html';
import 'package:flutter_conditional_dependencies_example/storage/key_finder_interface.dart';
Window windowLoc;
class WebKeyFinder implements KeyFinder {
WebKeyFinder() {
windowLoc = window;
print("Widnow is initialized");
// storing something initially just to make sure it works. :)
windowLoc.localStorage["MyKey"] = "I am from web local storage";
}
String getKeyValue(String key) {
return windowLoc.localStorage[key];
}
void setKeyValue(String key, String value) {
windowLoc.localStorage[key] = value;
}
}
KeyFinder getKeyFinder() => WebKeyFinder();
পদক্ষেপ -২.২: মোবাইল কী অনুসন্ধানকারী
import 'package:flutter_conditional_dependencies_example/storage/key_finder_interface.dart';
import 'package:shared_preferences/shared_preferences.dart';
class SharedPrefKeyFinder implements KeyFinder {
SharedPreferences _instance;
SharedPrefKeyFinder() {
SharedPreferences.getInstance().then((SharedPreferences instance) {
_instance = instance;
// Just initializing something so that it can be fetched.
_instance.setString("MyKey", "I am from Shared Preference");
});
}
String getKeyValue(String key) {
return _instance?.getString(key) ??
'shared preference is not yet initialized';
}
void setKeyValue(String key, String value) {
_instance?.setString(key, value);
}
}
KeyFinder getKeyFinder() => SharedPrefKeyFinder();
ধাপ 3:
import 'key_finder_interface.dart';
KeyFinder getKeyFinder() => throw UnsupportedError(
'Cannot create a keyfinder without the packages dart:html or package:shared_preferences');
তারপরে আপনার main.dart
ব্যবহারে KeyFinder
বিমূর্ত শ্রেণিটি যেন এটি একটি জেনেরিক বাস্তবায়ন। এটি কিছুটা অ্যাডাপ্টারের প্যাটার্নের মতো ।
main.dart
import 'package:flutter/material.dart';
import 'package:flutter_conditional_dependencies_example/storage/key_finder_interface.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
KeyFinder keyFinder = KeyFinder();
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: SafeArea(
child: KeyValueWidget(
keyFinder: keyFinder,
),
),
);
}
}
class KeyValueWidget extends StatefulWidget {
final KeyFinder keyFinder;
KeyValueWidget({this.keyFinder});
@override
_KeyValueWidgetState createState() => _KeyValueWidgetState();
}
class _KeyValueWidgetState extends State<KeyValueWidget> {
String key = "MyKey";
TextEditingController _keyTextController = TextEditingController();
TextEditingController _valueTextController = TextEditingController();
@override
Widget build(BuildContext context) {
return Material(
child: Container(
width: 200.0,
child: Column(
children: <Widget>[
Expanded(
child: Text(
'$key / ${widget.keyFinder.getKeyValue(key)}',
style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
),
),
Expanded(
child: TextFormField(
decoration: InputDecoration(
labelText: "Key",
border: OutlineInputBorder(),
),
controller: _keyTextController,
),
),
Expanded(
child: TextFormField(
decoration: InputDecoration(
labelText: "Value",
border: OutlineInputBorder(),
),
controller: _valueTextController,
),
),
RaisedButton(
child: Text('Save new Key/Value Pair'),
onPressed: () {
widget.keyFinder.setKeyValue(
_keyTextController.text,
_valueTextController.text,
);
setState(() {
key = _keyTextController.text;
});
},
)
],
),
),
);
}
}
কিছু স্ক্রিন শট
ওয়েব
মুঠোফোন
localstorage
এবংshared preferences
নির্ভরতা থাকা উচিত নয় । এর অর্থ হ'ল সংকলক এই নির্ভরতাগুলির মধ্যে কোনওটিই নাড়াচাড়া করতে পারে না। আদর্শভাবে আমদানিতে এই প্রয়োগগুলি লুকাতে হবে। আমি একটি পরিষ্কার বাস্তবায়নের উদাহরণ নিয়ে আসার চেষ্টা করব।